跟踪提交给ThreadPoolExecutor的任务

时间:2013-03-11 14:33:27

标签: java multithreading executor futuretask

我在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);
}

我已经创建了自己的runnable(VideoExportThread)实现,其中包含一个getProgress()方法来跟踪已提交任务的进度。我提交的实例如下:

executor.submit(new VideoExportThread(gcmPath));

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

由于

1 个答案:

答案 0 :(得分:5)

为什么不简单地保留一份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();