看圖
主軸蜓堕,狀態(tài)為新建(new),就緒(runnable)曙痘,運(yùn)行中(running)腰耙,結(jié)束(terminated)
主要的就緒(runnable和運(yùn)行中(running)這兩個(gè)狀態(tài)的切換主要是Jvm控制的
主軸上面的阻塞狀態(tài),發(fā)生條件等待鎖釋放資源枪芒,也是jvm控制的
主軸下面為等待狀態(tài)彻况,發(fā)生條件為object.wait(),調(diào)用object.notify()重新進(jìn)入就緒狀態(tài),等待jvm調(diào)度
sleep() 就是調(diào)用wait舅踪,就出了cpu的使用權(quán)纽甘,但是不會(huì)釋放鎖
yield()會(huì)讓當(dāng)前線程有運(yùn)行中(running)回到就緒(runnable)
join()讓線程并行執(zhí)行
舉個(gè)例子
主線程中調(diào)用sonThread.join();主線程就會(huì)進(jìn)入等待狀態(tài),一直等sonThread run()結(jié)束
它還有一個(gè)join(long millis)
舉個(gè)例子
主線程中調(diào)用sonThread.join(1000);主線程就會(huì)進(jìn)入等待狀態(tài)抽碌,一直等sonThread 執(zhí)行1000millis后在開始執(zhí)行
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則需要一直等到目標(biāo)線程run完
10 if (millis == 0) {
11 while (isAlive()) {
12 wait(0);
13 }
14 } else {
15 //如果目標(biāo)線程未run完且阻塞時(shí)間未到悍赢,那么調(diào)用線程會(huì)一直等待。
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()此操作會(huì)中斷等待中的線程货徙,并將線程的中斷標(biāo)志位置位左权。如果線程在運(yùn)行態(tài)則不會(huì)受此影響。
這只是個(gè)標(biāo)志位痴颊,并不會(huì)立即終止線程赏迟,需要自己在線程中判斷根據(jù)標(biāo)志位中斷,正在運(yùn)行的不受處理