Java线程在关闭后停止
我已经成功地为我的应用程序配置了同步启动,但我没有实现关机 我正在使用Java线程在关闭后停止,java,multithreading,inputstream,Java,Multithreading,Inputstream,我已经成功地为我的应用程序配置了同步启动,但我没有实现关机 我正在使用倒计时闩锁等待所有线程的关闭。每个线程循环,直到(volatile)布尔值(running)标志设置为false 下面是一个在线程上运行的示例(catch)Runnable System.out.println("STARTING"); startupLatch.countDown(); final BufferedReader reader = getReader(); String line; Syst
倒计时闩锁
等待所有线程的关闭。每个线程循环,直到(volatile
)布尔值(running
)标志设置为false
下面是一个在线程上运行的示例(catch
)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
将递减
我的控制台输出是:
开始
开始
等待结束
关闭
关闭
来自我的关闭
(关闭)方法
在我决定实施有序关机之前,这个循环是while(true)
循环;因此,阻塞readline
调用就可以了——实际上比在循环迭代时旋转更好——因为这是在另一个线程上。然而,现在我似乎需要剥离while循环,以确定何时发生关闭
是这里的问题吗? 如果是:readline
应该被阻塞吗readline
- 我怎样才能避开障碍物
reader.ready()
检查readLine()
的下一次调用是否会阻止当前线程您只能在套接字上使用非阻塞IO。要中断读卡器的磁盘操作或任何其他IO,应中断读卡器线程。在大多数情况下,您都会得到一条消息,这将打破循环。是的,readline
被认为是阻塞的。可以考虑编写<代码> Reader <代码>实例字段。然后,您可以使用一个方法,从另一个线程调用到关闭听起来您可能在使用套接字,或者?如果是,您可以使用Socket.setSoTimeout作为更可配置的接口(在设置更多输入的等待时间方面)alternative@MadProgrammer我正在使用我的close
方法跨多个线程同步闭包。好的,那么您正在关闭这些线程中每个线程的读取器?我正在释放每个线程上的(独立)资源