在你的代码中
workers[i] = new CallableWorkerThread(random.nextInt(100));FutureTask<Integer> task = new FutureTask<Integer>(workers[i]);executor.submit(task);
您创建了一个
FutureTask包装
CallableWorkerThread实例的,但是您正在使用submit接受一个任意值Runnable并返回
FutureTask包装一个的Runnable。
换句话说,您将自己包装
FutureTask在另一个中
FutureTask。有两种解决方法
- 使用
workers[i] = new CallableWorkerThread(random.nextInt(100));executor.submit(workers[i]);
让ExecutorService你包在Callable里面FutureTask。
- 使用
workers[i] = new CallableWorkerThread(random.nextInt(100));executor.execute(new FutureTask<Integer>(workers[i]));
Callable手动包装并排队,Runnable无需进一步包装(请注意使用execute而不是submit)
由于您要启用对original的检索Callable,因此第二个选项适合您,因为它可以让您完全控制FutureTask实例:
static class MyFutureTask<T> extends FutureTask<T> { final Callable<T> theCallable; public MyFutureTask(Callable<T> callable) { super(callable); theCallable=callable; }}提交代码:
for (int i=0; i< workers.length; i++){ workers[i] = new CallableWorkerThread(random.nextInt(100)); executor.execute(new MyFutureTask<Integer>(workers[i])); }RejectedExecutionHandler:
class RejectionHandlerImpl implements RejectedExecutionHandler{ public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { if(r instanceof MyFutureTask) { MyFutureTask<?> myFutureTask = (MyFutureTask)r; Callable<?> c=myFutureTask.theCallable; System.out.println(c); } else System.out.println(r); }}


