【发布时间】:2017-09-22 13:47:39
【问题描述】:
我是 java 多线程的新手。我正在尝试运行一个程序,该程序可以模拟多个将数据写入输出的“作家”。
我希望作者在某个时候都停下来,所以我对他们调用 wait(),但它不起作用。我知道问题出在哪里,但我不知道为什么会发生。
public void run() {
ExecutorService executor = Executors.newFixedThreadPool(nbOfWriters);
try {
// Create a list with all the writers that should run at the same time
Writer[] writers = new Writer[nbOfWriters];
for (int i = 0; i < nbOfWriters; i++) {
writers[i] = new Writer(i);
executor.execute(writers[i]);
}
/*
Expected outcome:
start every writer -> wait 3 seconds
pause every writer -> wait 3 seconds
run every writer -> wait 3 seconds
end
*/
TimeUnit.SECONDS.sleep(3);
for (Writer writer : writers) {
synchronized (writer) {
System.out.println("HERE 1");
writer.wait();
System.out.println("HERE 2");
}
}
TimeUnit.SECONDS.sleep(3);
for (Writer writer : writers) {
synchronized (writer) {
writer.notify();
}
}
Thread.sleep(3);
// End of the test
for (Writer writer : writers) writer.end();
}
catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
finally {
try {
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException ex) {
ex.getMessage();
}
finally {
executor.shutdownNow();
}
}
}
作家只是把东西写成输出(这里不重要)。 我添加了打印语句“HERE 1”和“HERE 2”来显示程序失败的地方。基本上永远不会到达“HERE 2”。
理论上应该发生的情况是我将数据写入输出 3 秒,然后 3 秒没有任何内容,然后再次将数据写入输出。
实际输出为: 东西被写为输出 3 秒。 印有“这里 1”。 东西继续显示为输出,没有暂停,没有“HERE 2”,程序永远不会停止。
在我看来,wait() 正在停止错误的线程。
【问题讨论】:
标签: java multithreading wait