2014-01-13 200 views
1

我正在创建用户线程并将它们放入size = 5的固定池中。我希望我的线程在5分钟内执行。这些线程在远程服务器上完成一些数据库操作但由于网络延迟,一些线程停止并等待来自远程服务器的响应,并因此导致我不想要的延迟。所以我希望所有待处理的线程在5分钟内完成,否则它们应该在特定的超时时间内被杀死或中断。我怎样才能做到这一点。在Executors.newFixedThreadPool中的单个线程上超时

我使用Jdk.1.6.0_45

 int i = 0; 
     ExecutorService executor = Executors.newFixedThreadPool(5); 
     while (i < 10) { 
      ThreadClass thread = new ThreadClass(); 
      thread.setCounter(i); 
      executor.execute(thread); 
      i++; 
     }   
     executor.shutdown(); 
     System.out.println("Wiating for threads to terminate"); 

     while (!executor.isTerminated()) {} 

     System.out.println("Finished all threads"); 
+0

名称'ThreadClass'表明它是Thread的子类。这是真的,还是只是一个Runnable的实现? – isnot2bad

+0

是的,它是Thread的子类。 –

+2

然后这是错的。任务和线程之间不同。任务是一项必须完成的工作(通常是一个Runnable)。线程是并行运行代码的机制。执行者已经在内部使用线程来执行任务。 ThreadClass应该是一个任务。重命名它并且不是从Thread派生而是实现Runnable! – isnot2bad

回答

1

试试这个方法:

executor.shutdown(); 
if (!executor.awaitTermination(5, TimeUnit.MINUTES)) { 
    executor.shutdownNow(); 
} 

如果你的线程上的一些功能测试对于中断阻止这只会工作。否则,你不能做太多的事情:除了中断之外,没有办法可靠地停止线程。