public void execute(Runnable command)
此命令对象包含提交的对象,但它似乎已被包装。
如何从自定义线程池执行程序中访问提交的对象?或者尝试从ThreadPoolExecutor的before / after / execute方法中访问提交的对象不是一个好主意吗?
答案 0 :(得分:4)
不要使用execute
,请使用submit
,它会返回Future
,这是该任务的句柄。这是一些示例代码:
ExecutorService service = Executors.newCachedThreadPool();
Callable<String> task = new Callable<String>() {
public String call() throws Exception {
return "hello world";
}
};
Future<String> future = service.submit(task);
虽然您无法直接访问该任务,但仍可以与其进行交互:
future.cancel(); // Won't start task if not already started
String result = future.get(); // blocks until thread has finished calling task.call() and returns result
future.isDone(); // true if complete
您还可以与服务进行互动:
service.shutdown(); //etc
已编辑注意到评论:
如果您想进行一些日志记录,请使用anonymous class覆盖afterExecute()
方法,如下所示:
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1)) {
@Override
protected void afterExecute(Runnable r, Throwable t)
{
// Do some logging here
super.afterExecute(r, t);
}
};
根据需要覆盖其他方法。
快速插头:恕我直言,这个主题的圣经是Java Concurrency in Practice - 我建议你买它并阅读它。