关闭后java线程停止

ijxebb2r  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(322)

我已经成功地为我的应用程序配置了一个同步启动,我没有实现关闭。
我用的是 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 应该是阻塞?
我怎样才能避开障碍物?

bwitn5fc

bwitn5fc1#

使用 reader.ready() 检查下一个电话 readLine() 将阻止当前线程

gg58donl

gg58donl2#

只能在套接字上使用非阻塞io。要中断读卡器的磁盘操作或任何其他io,应中断读卡器线程。在大多数情况下,你会得到interruptedioexception,这将打破循环。

相关问题