[英]ScheduledExecutorService shutdown not working with bufferedreader?
我正在使用Java8。我有一个线程需要在特定时间开始,并在特定时间结束。 我正在使用ScheduledExecutorService
来完成这项工作:
我有两个线程,一个叫“ worker”,另一个叫“ stopworker”。 Worker
类包含我需要在特定时间运行的实际代码,“ stopworker”线程只是关闭了调度程序。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.schedule(worker, startSeconds, TimeUnit.SECONDS);
scheduler.schedule(stopWorker, endSeconds, TimeUnit.SECONDS);
我的Worker
班:
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 StopWorker implements Runnable {
@Override
public void run() {
try {
scheduler.shutdownNow();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的代码可以在我想要的时间启动,但是它没有正确关闭。 我稍微弄弄了这段代码,发现这是因为我使用了BufferedReader
类。
如果我将“ worker”线程替换为简单的线程sleep语句,那么我的“ stopworker”将起作用! 这就是为什么我认为I / O部分可能会阻止我的关机的原因。
我关闭线程的唯一方法是使BufferedReader
变量成为全局变量,然后在StopWorker
类中手动将其关闭。 但是,代码很丑陋,并且会在代码中抛出IOException
。
我的猜测是shutdownNow
函数仍在首先等待I / O完成,对吗? 有什么好办法优雅地解决这个问题吗? 还是有更好的方法使线程在特定时间开始并在特定时间结束?
schedule()
返回ScheduledFuture
,它具有boolean cancel(boolean mayInterruptIfRunning)
方法。 如果输入流可以通过线程中断关闭,则只需使用true对其进行调用。
如果流不可中断,则需要显式关闭它。
阅读您所有的建议后,我已经弄清楚了。 感谢您的帮助,尤其是8472。 我进行了以下更改:1)将ScheduledExecutorService更改为ScheduledThreadPoolExecutor。 由于某些原因,ScheduledFuture cancel不适用于我的代码中的ScheduledExecutorService,而且我也不知道为什么。 2)取消类时,手动关闭BufferedReader。
希望这可以帮助有人遇到类似的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.