5

我在 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()并覆盖 executor 方法beforeExecute(Thread t, Runnable r),但在这两种情况下,返回的 runnable 都是 FutureTask 类型,它不包含太多数据。有没有办法让我使用它来检索我的原始VideoExportThread实例以识别哪些正在运行并查询其进度?

谢谢

4

1 回答 1

5

为什么不简单地保留一个 Runnable 列表?

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

另请注意,executor.submit(r);返回 a Future- 您可以调用其isDone()方法来检查提交的任务是否仍在运行。


旁注:手动管理作业队列可能有充分的理由,但如果没有,您可以使用其中一种工厂方法让您的生活更轻松。例如:ExecutorService executor = Executors.newCachedThreadPool();

于 2013-03-11T14:39:08.267 回答