我有线程池,它将带一个Callable
工作线程RejectionHandler
。我需要获得此Callable任务,RejectionHandler
但无法获得它。
在下面的示例中,我需要为RejectionHandler执行的Callable任务的uniqueId。在RejecitonHandler
中,Runnable
浇铸FutureTask
,我希望它应该被强制转换为Callable
工作线程。
请帮助我获取中的Callable
Worker线程实例RejectionHandler
。
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class RejectionDemo {
RejectionDemo(){
Random random = new Random();
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), new RejectionHandlerImpl());
CallableWorkerThread workers[] =
new CallableWorkerThread[10];
for (int i=0; i< workers.length; i++){
workers[i] = new CallableWorkerThread(random.nextInt(100));
FutureTask<Integer> task = new FutureTask<Integer>(workers[i]);
executor.submit(task);
}
}
public static void main(String args[]){
RejectionDemo demo = new RejectionDemo();
}
public class CallableWorkerThread implements
Callable<Integer> {
private int uniqueId;
CallableWorkerThread(int uniqueId) {
this.uniqueId = uniqueId;
}
public Integer call() {
System.out.println("Unique id="+uniqueId);
return uniqueId;
}
public String toString(){
return ""+uniqueId;
}
}
class RejectionHandlerImpl implements RejectedExecutionHandler{
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try{
System.out.println(r);
}catch(Throwable t){
t.printStackTrace();
}
}
}
}
java.util.concurrent.FutureTask@70036428
Unique id=68
java.util.concurrent.FutureTask@6ea4b78b
java.util.concurrent.FutureTask@e3f6d
java.util.concurrent.FutureTask@1ce84763
java.util.concurrent.FutureTask@55a6c368
java.util.concurrent.FutureTask@4e77b794
java.util.concurrent.FutureTask@15b57dcb
Unique id=55
Unique id=83
我期待CallableWorkerThread而不是FutureTask。帮助我获取WorkerThread实例。
在你的代码中
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
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);
}
}
问题内容: 我有线程池,它将带一个Callable工作线程。我需要获得此任务,RejectionHandler但无法获得它。 在下面的示例中,我需要为执行的Callable任务的uniqueId。在RejecitonHandler中,Runnable浇铸FutureTask,我希望它应该被强制转换为工作线程。 请帮助我在中获取线程实例。 输出量 我期待CallableWorkerThread而不是
[在这里输入图像描述][1][在这里输入图像描述][2]我知道很多人都有类似的问题。我展示了很多答案,尝试了在声纳网站上给出的示例代码。那个样品工作得很好。我还显示以下链接 maven 3.0.5 请帮我解决这个问题。 下面是父模块pom文件 我真的觉得这是jacoco或Sonarqube的bug。可能它不兼容Java8之类的东西。我几乎什么都试过了。sonar java插件2.5.1不推荐使用许
问题内容: 请帮助我得到一个where 本身就是一个泛型类型。如我现在所见,Spring RestTemplate现在不支持此功能。我正在使用Spring MVC版本3.1.2 这是我要使用的代码:代码: 我收到此错误: 这是明显的错误,但是今天如何解决呢? 比我想得到我的通用响应类型: 现在,我使用此解决方案,并且不使用: 问题答案: 通过引入修复了该问题,你可以显式继承该参数化类型,以便在运行
我试图创建一个程序,在这个程序中我可以接受输入,并用servlet获得一个数字的平方根。我是初学者,所以知道的不多。问题是当我尝试我的代码时,它不起作用。代码如下: myservletdemo.java 结果是:首先,当你点击链接时,你会得到: 这个结果
在尝试执行GET到发布者存储库时,我正在执行GET和无限循环。 出版商: 书: 完整代码可在此处获得: https://github.com/vanyasav/library
能够从我的VSTS发布管道进行身份验证,并且可以获得值 你能帮我调试一下吗?