线程的状态
线程被创建时,属于新建状态,调用start后进入就绪状态
就绪状态被cpu调用时,进入运行状态
运行状态在调用sleep、wait、join后会进入阻塞状态
运行状态执行完成后会进入死亡状态,这里包括正常执行完毕和异常执行完毕
运行状态在os切换时,线程会进入就绪状态
线程wait进入阻塞状态,被调用notify之后,会进入就绪状态
线程sleep进入阻塞状态,时间过后会进入就绪状态
当前线程的子线程join之后,当前线程进入阻塞状态,在子线程死亡之后,当前线程进入就绪状态
阻塞状态的线程,被中断之后会进入死亡状态
线程相关的一些方法解析
sleep
详细描述:
Thread类的静态方法
public static native void sleep(long millis) throws InterruptedException;
使当前线程睡眠n毫秒,线程从运行状态进入阻塞状态,n毫秒之后重新进入就绪状态,继而进入运行状态
进入阻塞状态后可以被中断
被调用t.interrupt()之后,该线程会被中断,sleep方法处抛出InterruptedException,捕获之后可以做相应处理
join
Thread类的非静态方法
public final void join() throws InterruptedException
使用举例:
Thread t = new Thread();
t.start();
t.join();
这里定义主线程main,子线程t
main调用t.join之后会进入阻塞状态,等待t线程的完结,t完结之后,main线程进入就绪状态
main线程在调用t.join之后,也可以被interrupt()中断。
yield
Thread类的非静态方法
public static native void yield();
当前线程主动让出cpu,从运行状态进入就绪状态,这个动作并不是立即执行的
interrupt
Thread类的非静态方法
public void interrupt()
线程对象调用interrupt之后,会从阻塞状态退出来,并抛出InterruptedException异常
wait
Object类的方法
public final void wait() throws InterruptedException
使用举例
Object obj;
obj.wait();
此方法必须在同步块中调用,wait之后线程进入阻塞状态,当是不会释放对象的锁
被调用interrupt()之后,该线程会被中断,抛出InterruptedException
notify
Object类的方法
public final native void notify()
Object obj;
obj.notify();
此方法会唤醒在对象obj上wait的线程,只会唤醒一个
notifyAll
Object类的方法
public final native void notifyAll();
Object obj;
obj.notifyAll();
此方法会唤醒在对象obj上wait的所有线程