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()此操作会中断等待中的线程,并将线程的中断标志位置位。如果线程在运行态则不会受此影响。
这只是个标志位,并不会立即终止线程,需要自己在线程中判断根据标志位中断,正在运行的不受处理