join()之讓執行緒按順序執行
Thread中的join()
主執行緒建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主執行緒往往將在子執行緒執行結束前結束。如果主執行緒想等待子執行緒執行完成後再結束(如,子執行緒處理一個數據,主執行緒需要取到這個值),則需要用到join()。
- 作用是:等待執行緒物件銷燬。
- join()在內部使用wait()方法進行等待,sychronized使用“物件監視器”原理。
- 使所屬的執行緒A正常執行run(),而當前執行緒B進行無期限的阻塞,等執行緒A銷燬後再繼續執行執行緒B後面的程式碼。
- 為受檢異常,需要丟擲InterruptedException
簡單例子
先定義一個Thread類:
/**
* Created by zero on 15-8-24.
*/
public class TestThread extends Thread {
private String mName;
private Thread mNextThread;
public TestThread(String name) {
mName = name;
}
public TestThread(String name,Thread next) {
mName = name;
mNextThread = next;
}
@Override
public void run() {
for (int i = 0 ; i < 3 ; i++) {
System.out.println(mName + ":" + i);
}
//...do something
if (mNextThread != null) {
try {
mNextThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Main函式:
public static void main(String[] args) {
TestThread A = new TestThread("A");
TestThread B = new TestThread("B",A);
TestThread C = new TestThread("C",B);
TestThread D = new TestThread("D",C);
A.start();
B.start();
C.start();
D.start();
}
//這個時候會按照start的順序執行
執行結果:
/usr/lib/jvm/jdk1.7.0_55/bin/java
A:0
A:1
A:2
B:0
B:1
B:2
C:0
C:1
C:2
D:0
D:1
D:2
Process finished with exit code 0
分析join原始碼
//join(),裡面呼叫join(0),有引數則延時執行join()
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) { //關鍵在這裡,如果存活一直等待
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
那麼wait() 又是神馬?
=.= !!原生函式。
public final native void wait(long timeout) throws InterruptedException;
明白它可以將執行緒掛起,就OK了。
相關推薦
join()之讓執行緒按順序執行
Thread中的join() 主執行緒建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主執行緒往往將在子執行緒執行結束前結束。如果主執行緒想等待子執行緒執行完成後再結束(如,子執行緒處理一個數據,主執行緒需要取到這個值),則需要用到join()。
多執行緒和併發(三)使用join方法讓執行緒按順序執行
一.執行緒的join方法作用 join方法把指定的執行緒新增到當前執行緒中,可以不給引數直接thread.join(),也可以給一個時間引數,單位為毫秒thread.join(500)。事實上join方法是通過wait方法來實現的。比如執行緒A中加入了執行緒B.join方法
多個執行緒按順序執行——join()
package com.jjyy.thread; /** * 假如有三個執行緒T1,T2,T3,如何保證T2在T3之前執行完成,T1在T2之前完成? * @author jiangyu 2015年9月7日 * 注意:執行緒的優先順序無法保障執行緒的執行次序。只不過優先
如何保證執行緒按順序執行
/* 有三個執行緒T1 T2 T3,如何保證他們按順序執行-轉載 在T2的run中,呼叫t1.join,讓t1執行完成後再讓T2執行 在T2的run中,呼叫t2.join,讓t2執行完成後再讓T3執行 */ public class ThreadByOrder { static Thread
讓10個執行緒按順序打印出0123456789
思路 1、通過公正瑣object對10個執行緒進行管理,喚醒所有執行緒或者阻塞等待。 2、通過orderNum通知下一個執行緒需要輸出的數字 程式碼 public class Printer { private static final
如何讓多個執行緒按照順序執行
兩種方法: 假設如下: 如果有a,b,c三個執行緒,我們依次執行這三個執行緒。因為不保證有序性,可能執行出來是混亂的 解決如下: 第一種使用join()方法,這個方法的作用是,讓當前執行執行緒等待直到呼叫join方法的執行緒結束執行
a,b,c三個執行緒按順序列印數字1-96 執行緒a列印1,b列印2,c列印3
程式的主入口 公共的物件鎖 列印方法的核心執行緒 具體的實現程式碼 PrintThread public class PrintThread implements Runnable { private String name;//執行緒名稱
用三個執行緒按順序迴圈列印abc 三個字母,比如abcabcabc
執行緒類 import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Ree
兩個執行緒按順序列印1~10
<pre name="code" class="cpp">#include <stdio.h> #include <stdlib.h> #include <p
實現併發執行緒按順序輸出123
問題:有first,second,third,forth四個執行緒,first輸出1,second輸出2,third輸出3,forth輸出4。要求, 同時啟動四個執行緒, 按順序輸出1234, 且未無限迴圈輸出。這是一個多執行緒協同的問題,本身多執行緒是沒有執行順序的, 順序不一定。但是可以採取一定方式使多執
三執行緒按順序交替列印ABC的四種方法
建立三個執行緒A、B、C,A執行緒列印10次字母A,B執行緒列印10次字母B,C執行緒列印10次字母C,但是要求三個執行緒同時執行,並且實現交替列印,即按照ABCABCABC的順序列印。 二、Synchronized同步法 1、基本思路 使用同步塊和wait、notify的
讓線程按順序執行8種方法
new 超過 需求 功能 並發 通過 流量 true throw 實現我們下面需要完成這樣一個應用場景: 1.早上;2.測試人員、產品經理、開發人員陸續的來公司上班;3.產品經理規劃新需求;4.開發人員開發新需求功能;5.測試人員測試新功能。 規劃需求,開發需求新功能,測試
NSOperation 執行緒終止 順序執行
剛好遇見你 - J 1,今天更新一下關於執行緒的一些知識。 相對於 GCD ,NSoperation 使用更加靈活,GCD雖然方便 但是一旦開啟,不能終止他的任務了,在開發中不太適合有些場景。 那麼 NSOperation 使用需要注意一點,就是依賴新增的時間 應該是在新
三個執行緒保證順序執行
第一種: 用Thread.join() 方法 確定該執行緒執行完畢,先建立執行緒1,然後建立執行緒2,在run()方法裡面呼叫執行緒2.join(),接著建立執行緒3,在run()方法裡面呼叫執行緒3.join() 第二種 執行緒池 newSin
三個執行緒依次順序執行
保證三個執行緒依次按順序執行 在有一些需求的情況下,我們需要三個執行緒依次按順序執行,那麼有人就會問了,為什麼不把三個執行緒的run方法依次放到三個方法體中,然後依次執行,按順序呼叫三個方法體,這樣不是同樣達到了目的了麼,為什麼非要弄的那麼複雜,我個人的觀點是
Java執行緒迴圈順序執行
遇到一個面試題需要3個執行緒順序執行,並迴圈10次,程式碼如下: public class MyThread extends Thread { private Object lock; private String showChar;
多執行緒同步之——兩個執行緒序列順序列印奇數和偶數的兩種實現
題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.
想要Jmeter中的多個執行緒組按順序執行
在一個指令碼檔案中,如果有多個執行緒組,並且想讓他們從上到下依次執行,只需在測試計劃頁面,勾選“獨立執行每個執行緒組”即可 “Run teardown thread groups after shutdown of main threads”的意思是:主執行緒關
有三個執行緒T1 T2 T3,如何保證他們按順序執行
T3先執行,在T3的run中,呼叫t2.join,讓t2執行完成後再執行t3 在T2的run中,呼叫t1.join,讓t1執行完成後再讓T2執行 public class JoinTest2 { // 1.現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1
java中按順序執行兩個執行緒的方法
比如有執行緒A和B,在A執行完成後B再開始執行 線上程A run方法最後啟動執行緒B - - 共享一個volatile boolean型別的標識變數,B一直檢查該變數的值,而A則在執行完成後改變A的