我正在嘗試編寫一個簡單的代碼來按順序打印數字。情景就像是3主題按順序打印數字
Thread Number
T1 1
T2 2
T3 3
T1 4
T2 5
T3 6
T1 7
T2 8
T3 9
...and so on.
這裏是
public class ThreadNumberPrinter {
Object monitor = new Object();
AtomicInteger number = new AtomicInteger(1);
public static void main(String[] args) {
ThreadNumberPrinter tnp = new ThreadNumberPrinter();
Thread t1 = new Thread(tnp.new Printer(1, 3));
Thread t2 = new Thread(tnp.new Printer(2, 3));
Thread t3 = new Thread(tnp.new Printer(3, 3));
t3.start();
t1.start();
t2.start();
}
class Printer implements Runnable {
int threadId;
int numOfThreads;
public Printer(int id, int nubOfThreads) {
threadId = id;
this.numOfThreads = nubOfThreads;
}
public void run() {
print();
}
private void print() {
try {
while (true) {
Thread.sleep(1000l);
synchronized (monitor) {
if (number.get() % numOfThreads != threadId) {
monitor.wait();
} else {
System.out.println("ThreadId [" + threadId
+ "] printing -->"
+ number.getAndIncrement());
monitor.notifyAll();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
但是剛過2號線運行,並打印數字2,所有線程進入觀望階段,並沒有被打印出來。我不確定我做錯了什麼。 任何幫助將不勝感激。
這可能是一個學習如何同步線程的有用練習,但它是線程如何使用的一個_bad示例。每當一個程序需要以某種特定的順序執行一些操作時,最好的方法就是讓_one_線程按照該順序執行這些操作。當你的程序有效地使用線程時,會發生一些事情發生在程序無法知道並且不關心它們發生的順序的地方。 –
在這種情況下使用ReentrantLock會有什麼優勢嗎? –