【笔记】java多线程 2 五种状态

多线程的5种状态

生:线程刚被创建出来,还没有进入可执行状态。

可执行:线程执行start()方法,进入就绪(可执行)状态,但是如果cpu未空闲,就无法立即进入执行状态。

执行:开始执行run()方法

死:run()方法结束。

睡眠|阻塞|等待:线程仍然活着,但没有运行,如果符合某事件,将重新回到可执行状态。

睡眠

Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。

注意:

1.sleep设置的时间是最短时间,而不是标准时间。sleep时间到期后,会进入可执行状态,而不是执行状态。

2.sleep是静态方法,只能就当前的线程拖入睡眠状态。

 

让步

线程的让步是通过yeild()方法实现的。

yeild()方法是暂停当前的线程,以执行其它线程。当前线程被执行yeild()方法后,会进入可执行状态。当yeild()执行后,程序根据各线程的优先级,可执行状态的线程中抽选优先级高的线程。因此当前的线程被yeild后,如果优先度依然最高,仍然会被执行。

 

java线程的sleep(),wait(),notify(),yield()方法的区别要点

1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行状态,但并不是立即执行,只是在被排程器调用的时候才执行。在休眠期间,并不释放所持有的“锁”;

2.wait()使线程休眠一段时间,若设置参数,时间到时,线程就自动进入可执行状态。若没有,则需要notify()方法去调用。注意:wait()方法和notify()方法都时针对this对象的,调用wait()方法后,会释放加在对象上的“锁”。

3.yield()使线程放弃执行的权利,进入可执行状态,也就意味着线程在yield()方法后,有可能又执行。使用yield()方法,线程并不释放自己锁持有的“锁”。以允许具有相同优先级的其他线程获得运行机会,必须是让给相同优先级

4、join()方法 
Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:
        Thread t = newMyThread();
        t.start();
        t.join();
另外,join()方法还有带超时限制的重载版本。 例如t.join(5000);则让线程等待5000毫秒,如果超过这个时间,则停止等待,变为可运行状态。
线程的加入join()对线程栈导致的结果是线程栈发生了变化,当然这些变化都是瞬时的。

 

interrupt()方法和stop()方法的区别

1.interrupt():通知该线程中止,当改线程进行到阻塞状态时(sleep等),才会退出线程。

2.stop():强行退出线程,有可能导致异常发生,所以不建议使用该方法。

原文地址:https://www.cnblogs.com/nonkicat/p/2685265.html