Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程在关闭后停止_Java_Multithreading_Inputstream - Fatal编程技术网

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
方法跨多个线程同步闭包。好的,那么您正在关闭这些线程中每个线程的读取器?我正在释放每个线程上的(独立)资源