我在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
实例,以便确定哪些实例正在运行并查询其进度?
由于
答案 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();
。