繁体   English   中英

ScheduledExecutorService关闭不能与bufferedReader一起使用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM