Thread状态相关

2018-06-27  本文已影响0人  DustMoon

看图


主轴,状态为新建(new),就绪(runnable),运行中(running),结束(terminated)

主要的就绪(runnable和运行中(running)这两个状态的切换主要是Jvm控制的

主轴上面的阻塞状态,发生条件等待锁释放资源,也是jvm控制的

主轴下面为等待状态,发生条件为object.wait(),调用object.notify()重新进入就绪状态,等待jvm调度

sleep() 就是调用wait,就出了cpu的使用权,但是不会释放锁

yield()会让当前线程有运行中(running)回到就绪(runnable)

join()让线程并行执行
举个例子
主线程中调用sonThread.join();主线程就会进入等待状态,一直等sonThread run()结束

它还有一个join(long millis)

举个例子
主线程中调用sonThread.join(1000);主线程就会进入等待状态,一直等sonThread 执行1000millis后在开始执行

public final synchronized void join(long millis) throws InterruptedException {
 2     long base = System.currentTimeMillis();
 3     long now = 0;
 4 
 5     if (millis < 0) {
 6         throw new IllegalArgumentException("timeout value is negative");
 7     }
 8     
 9     //0则需要一直等到目标线程run完
10     if (millis == 0) {
11         while (isAlive()) {
12             wait(0);
13         }
14     } else {
15         //如果目标线程未run完且阻塞时间未到,那么调用线程会一直等待。
16         while (isAlive()) {
17             long delay = millis - now;
18             if (delay <= 0) {
19                 break;
20             }
21             wait(delay);
22             now = System.currentTimeMillis() - base;
23         }
24     }
25 }

interrupt()此操作会中断等待中的线程,并将线程的中断标志位置位。如果线程在运行态则不会受此影响。

这只是个标志位,并不会立即终止线程,需要自己在线程中判断根据标志位中断,正在运行的不受处理

上一篇下一篇

猜你喜欢

热点阅读