我已经成功地为我的应用程序配置了一个同步启动,我没有实现关闭。
我用的是 CountDownLatch
等待我所有的线索结束。每个线程循环直到( volatile
)布尔值, running
,标志设置为false。
下面是一个例子( Caught
) Runnable
在线程上运行
System.out.println("STARTING");
startupLatch.countDown();
final BufferedReader reader = getReader();
String line;
System.out.println("STARTED");
while (running) {
System.out.println("WAITING FOR CLOSE");
while ((line = reader.readLine()) != null) {
System.out.println("WAITING FOR NO MORE LINES");
System.out.println(line);
}
}
shutdownLatch.countDown();
System.out.println("EXITED READING THREAD: EXITS LEFT: " + shutdownLatch.getCount());
起初,我认为对running标志的更改可能没有传递给线程,但事实证明,线程实际上在之后的某个地方被阻塞了 reader.readLine()
-因此,while循环的下一次迭代无法到达,其中 shutdownLatch
就会减少。
我的控制台输出是:
启动
起动
等待关闭
正在关闭 SHUTTING DOWN
来吧,这是我的 close
(关机)方法。
这个循环是一个 while(true)
循环前我决定实施有序关机;所以,一个阻塞 readline
调用会很好-实际上比在循环迭代时旋转更好-因为这在另一个线程上。然而,现在我似乎需要剥离while循环,以确定何时关闭。
是 readline
这里的问题?如果是:
是 readline
应该是阻塞?
我怎样才能避开障碍物?
2条答案
按热度按时间bwitn5fc1#
使用
reader.ready()
检查下一个电话readLine()
将阻止当前线程gg58donl2#
只能在套接字上使用非阻塞io。要中断读卡器的磁盘操作或任何其他io,应中断读卡器线程。在大多数情况下,你会得到interruptedioexception,这将打破循环。