2013-03-11 5 views
4

Я выполняю несколько задач в ThreadPoolExecutor. Я инициализирую его следующим образом:Отслеживать задачи, отправленные ThreadPoolExecutor

private VideoExportExecutor executor; 
private BlockingQueue<Runnable> jobQueue; 

public void initialiseVideoProcessor() 
{ 
    jobQueue = new LinkedBlockingQueue<Runnable>(); 
    executor = new VideoExportExecutor(1, 1, Long.MAX_VALUE, TimeUnit.SECONDS, jobQueue); 
} 

Я сделал свою собственную реализацию работоспособного (VideoExportThread), который содержит метод getProgress(), чтобы следить за ход представленных задач. Я представить экземпляры это следующим образом:

executor.submit(new VideoExportThread(gcmPath)); 

Я после того, как способ для запроса исполнителю/BlockingQueue для текущих/отложенных потоков. Я попытался использовать jobQueue.toArray() и переопределить метод-исполнитель beforeExecute(Thread t, Runnable r), но в обоих случаях возвращаемый runnable имеет тип FutureTask, который не содержит большого количества данных. Есть ли способ использовать его для извлечения моего оригинального экземпляра VideoExportThread, чтобы определить, какие из них запущены, и запросить его прогресс?

Thanks

ответ

4

Почему бы не просто сохранить список ваших Runnables?

List<Runnable> runnables = new ArrayList<>(); 
VideoExportThread r = new VideoExportThread(gcmPath); 
runnables.add(r); 
executor.submit(r); 

отметить также, что executor.submit(r); возвращает Future - вы можете вызвать метод isDone(), чтобы проверить, если поданная задача все еще работает.


Боковой комментарий: там может быть хорошей причиной для управления очередью заданий вручную, но если нет, то вы используете один из фабричных методов, чтобы сделать вашу жизнь проще. Например: ExecutorService executor = Executors.newCachedThreadPool();.

+0

То, что я в конечном итоге делать. Я думаю, что было бы проще запрашивать непосредственно у исполнителя/blockingList, но это выполнит эту работу. Благодарю. – tishu