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