Java CompletionService和ObjectPool

Java CompletionService和ObjectPool,java,multithreading,threadpool,pool,future,Java,Multithreading,Threadpool,Pool,Future,一旦在一个辅助线程失败后从辅助线程取消thred。 然后,completionService.take().get()会给出CancellationException,因为它已被取消 因此,myRunnableObj2对象不会返回到池中,因为get()会在取消时引发异常。这怎么办 作为一个临时解决方案,我将考虑设置future.cancel(false),这样我就不会把正在运行的任务搞砸,从而降低了可靠性。请提供更多信息好吗?我无法从不完整的代码片段中理解您的问题。当然,我将解释代码。有一个工人

一旦在一个辅助线程失败后从辅助线程取消thred。 然后,completionService.take().get()会给出CancellationException,因为它已被取消


因此,myRunnableObj2对象不会返回到池中,因为get()会在取消时引发异常。这怎么办

作为一个临时解决方案,我将考虑设置future.cancel(false),这样我就不会把正在运行的任务搞砸,从而降低了可靠性。请提供更多信息好吗?我无法从不完整的代码片段中理解您的问题。当然,我将解释代码。有一个工人是可以工作的。这将从另一个线程[中间的代码段]提交给CompletionService。所以,无论何时工作线程以suces/INterruptException完成,我都需要从池中释放该对象作为清理步骤。因此,我有第三个线程用于监视completionService并释放resource+以获取其返回状态。当收到的状态为false时,包括正在运行的线程在内的其余线程将被取消,并向它们发送InterruptedException。我在这些工作线程中捕获该异常并返回。但是,completionService.take().get()然后开始抛出CancellationException,我没有对正在运行的对象的引用,因此,我无法将其返回到池。我正在考虑将池传递给每个工作线程,在工作线程的最后一个块中,我可以在不丢失引用的情况下释放它。
//Worker Thread
class MyRunnable implements Runnable {

private String status;

public void getStatus() {
  return status;
}

public void run() {
    try {   
       if(Thread.interrupted()) throw new InterruptedException();
     }catch(InterruptedException ie) {
         status= "FAIL";
         return;
     }
 }        


 //Thread that submits Workers 
 MyRunnable myRunnableObj1 = getObjectPool().borrow();
 futures.add(completionService.submit(myRunnableObj1,myRunnableObj1));


 //A Helper thread to return Objects to pool
 new Callable() {
 public String call() {
   MyRunnable myRunnableObj2 = completionService.take().get();
   getObjPool().returnObject(myRunnableObj2):

   if(myRunnableObj2.getStatus= "FAIL") {
   for(Future future : futures) {
    if(!future.isDone()) 
    future.cancel(true);
   }
   return myRunnableObj2.getStatus();
 }