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