从ThreadPoolExecutor中访问提交的对象

时间:2011-07-03 12:03:58

标签: java threadpool

public void execute(Runnable command)

此命令对象包含提交的对象,但它似乎已被包装。

如何从自定义线程池执行程序中访问提交的对象?或者尝试从ThreadPoolExecutor的before / after / execute方法中访问提交的对象不是一个好主意吗?

1 个答案:

答案 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 - 我建议你买它并阅读它。