讓10個執行緒按順序打印出0123456789
阿新 • • 發佈:2019-01-05
思路
- 1、通過公正瑣object對10個執行緒進行管理,喚醒所有執行緒或者阻塞等待。
- 2、通過orderNum通知下一個執行緒需要輸出的數字
程式碼
public class Printer {
private static final int endNum = 10;
static int orderNum = 0;
//公正瑣,只有獲得該瑣資源才能進行下一步操作
static Object object= new Object();
static class ThreadPrinter extends Thread {
private int printNum;
public ThreadPrinter(int printNum) {
this.printNum = printNum; //獲取自己需要列印的數字
}
@Override
public void run() {
synchronized (object) { //判斷該資源是否正在被佔用
while (orderNum < endNum) { //如果資源空閒則鎖定資源判斷是否已經列印完成
if (orderNum == printNum) { //沒有列印完成則判斷是否是自己需要列印的數字
System.out.print(printNum);
orderNum++;
if (orderNum == 10) {
System.out.println("\n列印完成");
}
object.notifyAll(); //列印完成後喚醒所有等待的執行緒
} else {
try {
object.wait();//不是自己列印的數字則該執行緒被阻塞,繼續等待
} catch (InterruptedException e) {
System.out.println("執行緒" + printNum + "被打斷了");
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
ThreadPrinter[] threadPrinters = new ThreadPrinter[10];
//初始化執行緒並且啟動,
//為了證明執行緒瑣的作用,執行緒從後面開始啟動
for (int i = endNum-1; i >= 0; i--) {
threadPrinters[i] = new ThreadPrinter(i);
threadPrinters[i].start();
}
}
}
執行結果
0123456789
列印完成