java 執行緒間通訊的幾種方式
阿新 • • 發佈:2018-12-06
1.如何讓兩個執行緒依次執行
假設有兩個執行緒,一個執行緒A,一個執行緒B,兩個執行緒分別依次列印 1-3 三個數字即可。
package Test;/**
/**
* @author Administrator
* @createdate 2017-10-10
*/
public class demo1 {
public static void main(String[] args){
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
printNumber("A");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
printNumber("B");
}
});
thread1.start();
thread2.start();
}
private static void printNumber(String threadname){
int i=0;
while (i++ <3){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadname + " print:" +i);
}
}
}
其中的 printNumber(String) 實現如下,用來依次列印 1, 2, 3 三個數字:通過將執行緒休眠的方式來控制兩個執行緒一次來執行。
執行的結果如下:可以看到執行的結果是兩個執行緒依次執行。
2.如何讓兩個執行緒交叉順序執行
我現在希望 A 在列印完 1 後,再讓 B 列印 1, 2, 3,最後再回到 A 繼續列印 2, 3。要如何來執行呢。看如下的程式碼
package Test;/**
/**
* @author Administrator wangtao
* @createdate 2017-10-10
*/
public class demo2 {
public static void main(String[] args){
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
printNumber("A");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("B 開始等待 A");
try {
thread1.join();//我會等待執行緒1執行完成後再進行執行
} catch (InterruptedException e) {
e.printStackTrace();
}
printNumber("B");
}
});
thread1.start();
thread2.start();
}
private static void printNumber(String threadname){
int i=0;
while (i++ <3){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadname + " print:" +i);
}
}
}
利用Thread.join()方法來實現,join()方法的作用是等待呼叫執行緒執行完之後再執行任務。看最後的執行結果知道,
B執行緒是等到A全部執行完成之後才開始執行。