ScheduledExecutorService 关闭不适用于 bufferedreader?
ScheduledExecutorService shutdown not working with bufferedreader?
我正在使用 Java 8. 我有一个线程需要在特定时间开始并在特定时间结束。我正在使用 ScheduledExecutorService
来完成这项工作:
我有两个线程,一个是 "worker",另一个是 "stopworker"。 Worker
class 包含我在特定时间需要 运行 的实际代码,"stopworker" 线程只是关闭调度程序。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.schedule(worker, startSeconds, TimeUnit.SECONDS);
scheduler.schedule(stopWorker, endSeconds, TimeUnit.SECONDS);
我的Worker
class:
class Worker implements Runnable {
@Override
public void run() {
try {
// HTTP GET method to call and REST API and get Streaming
// data back, it will keep alive as long as possible and
// gets lots of data back
...
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.getStream()));
// deal with the data
...
} catch (IOException e) {
} finally {
reader.close();
}
}
}
我的StopWorker
class:
class StopWorker implements Runnable {
@Override
public void run() {
try {
scheduler.shutdownNow();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的代码可以在我想要的时间启动,但是,它没有正确关闭。我对fiddle这个代码有点了解,发现这是因为BufferedReader
class我用了。
如果我将 "worker" 线程替换为一个简单的线程睡眠语句并且我的 "stopworker" 可以工作!这就是为什么我认为 I/O 部分可能会阻止我关机。
我关闭线程的唯一方法是使我的 BufferedReader
变量成为全局变量并在 StopWorker
class 中手动关闭它。但是,代码会很丑陋,并且会在代码中抛出一个 IOException
。
我的猜测是 shutdownNow
函数仍在等待 I/O 先完成,对吗?有什么好的方法可以优雅地解决这个问题吗?或者有没有更好的方法让线程在特定时间开始并在特定时间结束?
schedule()
returns一个ScheduledFuture
,其中有一个boolean cancel(boolean mayInterruptIfRunning)
方法。如果输入流可通过线程中断关闭,则只需使用 true 调用它即可。
如果流不可中断,那么您需要明确关闭它。
在阅读了您的所有建议后,我已经解决了这个问题。感谢您的帮助,尤其是对于 the8472。
我改变了以下内容:
1)将ScheduledExecutorService改为ScheduledThreadPoolExecutor。
由于某些原因,ScheduledFuture cancel 在我的代码中不适用于 ScheduledExecutorService,我不知道为什么。
2)取消class.
时手动关闭BufferedReader
希望这对遇到类似问题的人有所帮助。
我正在使用 Java 8. 我有一个线程需要在特定时间开始并在特定时间结束。我正在使用 ScheduledExecutorService
来完成这项工作:
我有两个线程,一个是 "worker",另一个是 "stopworker"。 Worker
class 包含我在特定时间需要 运行 的实际代码,"stopworker" 线程只是关闭调度程序。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.schedule(worker, startSeconds, TimeUnit.SECONDS);
scheduler.schedule(stopWorker, endSeconds, TimeUnit.SECONDS);
我的Worker
class:
class Worker implements Runnable {
@Override
public void run() {
try {
// HTTP GET method to call and REST API and get Streaming
// data back, it will keep alive as long as possible and
// gets lots of data back
...
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.getStream()));
// deal with the data
...
} catch (IOException e) {
} finally {
reader.close();
}
}
}
我的StopWorker
class:
class StopWorker implements Runnable {
@Override
public void run() {
try {
scheduler.shutdownNow();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的代码可以在我想要的时间启动,但是,它没有正确关闭。我对fiddle这个代码有点了解,发现这是因为BufferedReader
class我用了。
如果我将 "worker" 线程替换为一个简单的线程睡眠语句并且我的 "stopworker" 可以工作!这就是为什么我认为 I/O 部分可能会阻止我关机。
我关闭线程的唯一方法是使我的 BufferedReader
变量成为全局变量并在 StopWorker
class 中手动关闭它。但是,代码会很丑陋,并且会在代码中抛出一个 IOException
。
我的猜测是 shutdownNow
函数仍在等待 I/O 先完成,对吗?有什么好的方法可以优雅地解决这个问题吗?或者有没有更好的方法让线程在特定时间开始并在特定时间结束?
schedule()
returns一个ScheduledFuture
,其中有一个boolean cancel(boolean mayInterruptIfRunning)
方法。如果输入流可通过线程中断关闭,则只需使用 true 调用它即可。
如果流不可中断,那么您需要明确关闭它。
在阅读了您的所有建议后,我已经解决了这个问题。感谢您的帮助,尤其是对于 the8472。 我改变了以下内容: 1)将ScheduledExecutorService改为ScheduledThreadPoolExecutor。 由于某些原因,ScheduledFuture cancel 在我的代码中不适用于 ScheduledExecutorService,我不知道为什么。 2)取消class.
时手动关闭BufferedReader希望这对遇到类似问题的人有所帮助。