0

我正在使用Java 8.我有一个线程需要在特定时间开始并在特定时间结束。我正在使用ScheduledExecutorService来完成这项工作:ScheduledExecutorService关闭不能与bufferedreader一起使用?

我有两个线程,一个名称是“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完成,我是对吗?有没有一种很好的方法解决这个优雅?还是有更好的方法让线程在特定的时间开始并在特定的时间结束?

+0

您是否在线程实现中正确地关闭了'BufferedReader reader'?考虑将其封装到[try-with-resources]中(https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)块 –

+1

解决方法是关闭线程阻塞的资源。工作人员应该期望处理IOException。 –

+0

是的,我试图抓住我的代码终于阻止,对不起,我忘了把它添加到帖子,我已经编辑。我如何关闭阻塞的线程?我可以在哪里添加该代码? –

回答

0

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

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

0

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

希望这会帮助有人有类似的问题。

相关问题