Доступ к представленному объекту из ThreadPoolExecutor - PullRequest
1 голос
/ 03 июля 2011

public void execute(Runnable command)

Этот объект команды содержит отправленный объект, но, похоже, он был перенесен.

Как получить доступ к отправленному объекту из пользовательского исполнителя пула потоков?Или это не такая хорошая идея, чтобы попытаться получить доступ к предоставленному объекту из методов ThreadPoolExecutor до / после / выполнить?

1 Ответ

4 голосов
/ 03 июля 2011

Не используйте 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    

РЕДАКТИРОВАНИЕ ДЛЯ ВСТАВЛЕНИЯ КОММЕНТАРИЙ:

Если вы хотите сделать какую-нибудь запись, используйте анонимный класс , чтобы переопределить метод 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 на практике - я рекомендую вам купитьэто и прочитайте это.

...