在你的代码中
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
(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); }}


