2013-03-11 74 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)); 

我在查询当前/挂起线程的executor/blockingQueue后。我试图使用jobQueue.toArray()并重写执行器方法beforeExecute(Thread t, Runnable r),但是在这两种情况下,返回的runnable都是FutureTask类型,它不包含太多数据。有没有办法让我使用它来检索我的原始VideoExportThread实例,以确定哪些正在运行并查询其进度?

谢谢

回答

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

这就是我最终会做的。我认为直接查询执行者/阻塞列表会更清晰,但是这会完成这项工作。谢谢。 – tishu 2013-03-11 14:51:21