gpt4 book ai didi

java - Java线程池RejectedExecutionHandler传入的runnable对象是什么

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:29 26 4
gpt4 key购买 nike

我有thread pool with a RejectedExecutionHandler像这样和一个可运行的任务。

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

interface MyTask extends Runnable { ... }

class MyTaskImpl implements MyTask { ...}

我执行这样的任务

   sExecutorService.submit(myTask);        

在 rejectedExecution 案例中,我希望获得被拒绝的 Runnable(即 MyTask)并在其中设置一些字段,将其标记为被拒绝。但我无法将其转换到 MyTask。那么传递给 rejectedExecution 的 runnable 到底是什么?似乎不是我提交的 MyTask。以及如何在 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

最佳答案

问题是当您使用提交方法 TreadPoolExecutor(实际上是 AbstractExecutorService)提交任务时将其包装到 FutureTask。之后你收到 FutureTask 而不是你的 Runnable。您可以调用执行而不是提交:

sExecutorService.execute(yourTask);

我认为没有办法从 FutureTask 获取您的任务。你只能为它调用运行。因此,如果您想调用提交并且需要调用运行 - 只是不要转换为 MyTask:

FutureTask myTask = (FutureTask) runnable;
myTask.run();
Object result = myTask.get();

如果你想访问你的 MyTask 对象,可以创建 MyFutureTask extends 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;
}
}

您还需要扩展 ThreadPoolExecutor 并重新定义负责将 Runnable 包装到 FutureTask 的 newTaskFor 方法:

public class MyThreadPoolExecutor extends ThreadPoolExecutor {

@Override
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new MyFutureTask(task, value);
}
}

之后您可以将 MyThreadPoolExecutor 用作 ThreadPoolExecutor 并拒绝任务处理:

MyFutureTask myFutureTask = (MyFutureTask) runnable;
MyTask myTask = (MyTask) myFutureTask.getMyTask();
// Now you can do what you want with you task:
myTask.doSomthing();

关于java - Java线程池RejectedExecutionHandler传入的runnable对象是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10931396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com