Java基础10-线程与多线程

多线程

实现线程的两种方式

继承java.lang.Thread类

重写run()方法,并将功能代码放到run()方法中,调用start()方法

public class MyThread extends Thread {
    private int i = 10;

    public void run() {
        while (i > 0) {
            System.out.println(i--);
        }
    }

    public static void main(String[] args) {
        new MyThread().start();
    }
}

实现java.lang.Runnable接口

当需要实现多线程的类需要继承其他类不方便继承Thread时,通过Runnable接口实现多线程。
实际上,Thread类也实现了Runnable接口
Thread类有两个构造方法:public Thread(Runnable target)、public Thread(Runnable target, String name)
用new Thread(Runnable target).start()方法来启动

Runnable接口的两大好处,1.可以不用继承Thread类,方便继承其他类;2.可以对同一个对象开启多线程

线程的生命周期,五种状态

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。

新建:NEW就是刚使用new方法,new出来的线程;
就绪:RUNNABLE就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
运行:RUNNING当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
阻塞:BLOCKED/WAITING/TIMED_WAITING在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
销毁:TIMINATED如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

https://www.cnblogs.com/marsitman/p/11228684.html

Thread方法

getName()获取线程名
getState()获取线程状态
sleep(1000)休眠1000毫秒
yield()礼让,不一定成功
join()强制插队,其他线程阻塞,待插队线程执行完
setPriority(5)设置优先级为5,需要在start()前设置
getPriority()

守护线程deamon

线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕,而不需要等待守护线程执行完毕

守护线程:logger,System.gc()
调用setDeamon(true)将用户线程转化成守护线程

线程安全

线程同步机制,有效防止资源冲突
队列+锁,每个对象都有一把锁,sleep()不会释放锁

  1. 同步块
    使用sychronized关键字
    sychronized(Object)
  2. 同步方法
    在方法前面修饰sychronized关键字
posted @ 2021-01-13 21:19  tanjr  阅读(113)  评论(0)    收藏  举报