我正在尝试编写一个简单的代码来按顺序打印数字。情景就像是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会有什么优势吗? –