【发布时间】:2015-06-21 11:44:14
【问题描述】:
我正在尝试编写一个简单的代码来按顺序打印数字。场景就像
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 之后,所有线程都进入等待阶段并且没有打印任何内容。我不确定我在哪里做错了。 任何帮助将不胜感激。
【问题讨论】:
-
这可能是学习如何同步线程的有用练习,但它是一个糟糕的示例,说明了如何使用线程。每当一个程序需要以某种特定顺序执行许多操作时,最好的方法是让 一个 线程按该顺序执行操作。当您的程序有效地使用线程时,会发生一些程序无法知道并且不关心它们发生的顺序的事情。
-
在这种情况下使用 ReentrantLock 是否比同步有任何优势?
-
n 线程的通用解决方案:stackoverflow.com/a/49714113/1216775
标签: java multithreading