Java线程池RejectedExecutionHandler中传递的可运行对象是什么

Java线程池RejectedExecutionHandler中传递的可运行对象是什么,java,threadpool,Java,Threadpool,我有一个像这样的任务 sExecutorService = new ThreadPoolExecutor( ... new MyRejectionHandler() ); interface MyTask extends Runnable { ... } class MyTaskImpl implements MyTask { ...} 我执行这样的任务 sExecutorService.submit(myTask); 在rejectedExecut

我有一个像这样的任务

sExecutorService = new ThreadPoolExecutor( ...    new MyRejectionHandler() );

interface MyTask extends Runnable { ... }

class MyTaskImpl implements MyTask { ...}     
我执行这样的任务

   sExecutorService.submit(myTask);        
在rejectedExecution案例中,我希望获得RejectedRunnable(即MyTask),并在其中设置一些字段,将其标记为rejected。但我不能把它交给我的任务。 那么,拒绝执行的可运行传递到底是什么呢?它似乎不是我提交的任务。以及如何在RejectedExecutionHandler中获取被拒绝的任务

public class MyRejectionHandler implements RejectedExecutionHandler{  
   public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor)  {
    MyTask myTask = (MyTask) runnable; // exception
    myTask.doSomething();
   }
java.lang.ClassCastException: java.util.concurrent.FutureTask cannot be cast to MyTask       

问题是当您使用submit方法TreadPoolExecutor(实际上是AbstractExecutorService)将任务提交到FutureTask时。之后,您将收到FutureTask而不是Runnable。您可以调用execute not submit:

sExecutorService.execute(yourTask);
我认为没有办法从未来任务中获得你的任务。你只能叫run。因此,如果您想调用submit并需要调用run-只需不转换为MyTask即可:

FutureTask myTask = (FutureTask) runnable;
myTask.run();
Object result = myTask.get();
另一种方法是,如果您想访问MyTask对象,可以创建MyFutureTask扩展FutureTask,这将允许获取您的对象:

public MyFutureTask<V> extends FutureTask<V> {

    private Runnable myTask;

    public MyFutureTask(Runnable runnable, V result) {
        super(runnable, result);
        this.myTask = runnable;
    }

    public Runnable getMyTask() {
        return myTask;
    }        
}

谢谢我使用submit()是因为我想要将来的返回值。我以批处理的方式提交许多任务,有时我需要返回并从“主”线程取消批处理的所有提交ted任务。如果我使用execute(),我就不会得到将来的返回值来取消()。请用第二部分编辑我的答案-for FutureTask和submit call。好的,我不想运行它。我只想在其中设置一些字段,将其标记为拒绝。这就是为什么我一直在寻找获取MyTask实例的原因。我想从您的答案中可能无法获得MyTask实例。(我将探索其他方法)。感谢我的回答,让我展示一种从FutureTask获得任务的可行方法。希望能有帮助。谢谢。对于我的用例,我解决了这个问题,因为当任务被拒绝时,submit()将抛出RejectedExecutionException。我只是抓住它并处理任务。创建线程池时,请使用
ThreadPoolExecutor.AbortPolicy()
,它将简单地重新显示异常。请参阅本文。此链接给出了ThreadPoolExecutor和RejectionHandler的示例。但是它不能解释任何关于我所问的非常具体的问题,也不能推断任何关于这个问题的任何东西。
public class MyThreadPoolExecutor extends ThreadPoolExecutor {

    @Override
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new MyFutureTask(task, value);            
    }
}
MyFutureTask myFutureTask = (MyFutureTask) runnable;
MyTask myTask = (MyTask) myFutureTask.getMyTask();
// Now you can do what you want with you task:
myTask.doSomthing();