我正在 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));
我正在寻找一种方法来查询当前/未决线程的执行程序/阻塞队列。我尝试使用 jobQueue.toArray()
并覆盖执行器方法 beforeExecute(Thread t, Runnable r)
但在这两种情况下返回的 runnable 都是 FutureTask 类型不包含太多数据。有没有办法让我使用它来检索我的原始 VideoExportThread
实例,以便识别正在运行的实例并查询其进度?
谢谢
最佳答案
为什么不简单地保留一个 Runnable 列表?
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();
。
关于java - 跟踪提交给 ThreadPoolExecutor 的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15341186/