ScheduledExecutorService关闭不使用bufferedreader?

时间:2016-07-31 10:41:32

标签: java multithreading executorservice threadpoolexecutor scheduledexecutorservice

我正在使用Java 8.我有一个线程需要在特定时间开始并在特定时间结束。我正在使用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类。

如果我更换了"工人"线程进入一个简单的线程睡眠声明和我的" stopworker"作品!这就是为什么我认为I / O部件可能会阻止我的关机。

我关闭线程的唯一方法是将BufferedReader变量设为全局变量,并在StopWorker类中手动关闭它。但是,代码很难看,代码中会抛出IOException

我的猜测是shutdownNow函数仍在等待I / O完成,我是对的吗?有一个好方法可以优雅地解决这个问题吗?或者是否有更好的方法让线程在特定时间开始并在特定时间结束?

2 个答案:

答案 0 :(得分:0)

schedule()返回ScheduledFuture,其中包含boolean cancel(boolean mayInterruptIfRunning)方法。如果输入流可以通过线程中断关闭,那么只需用true调用它。

如果流不可中断,则需要明确关闭它。

答案 1 :(得分:0)

在阅读完所有建议后,我已经弄明白了。感谢您的帮助,特别是对于8472。 我改变了以下内容: 1)将ScheduledExecutorService更改为ScheduledThreadPoolExecutor。 出于某些原因,ScheduledFuture取消在我的代码中不能与ScheduledExecutorService一起使用,我不知道为什么。 2)取消课程时手动关闭BufferedReader。

希望这会帮助某些人遇到类似的问题。