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

送信されたタスクの進行状況を追跡VideoExportThreadするメソッドを含むrunnable()の独自の実装を作成しました。getProgress()私はこれのインスタンスを次のように提出します:

executor.submit(new VideoExportThread(gcmPath));

現在/保留中のスレッドについてexecutor/blockingQueueにクエリを実行する方法を探しています。executorメソッドを使用jobQueue.toArray()してオーバーライドしようとしましbeforeExecute(Thread t, Runnable r)たが、どちらの場合も、返されるランナブルはFutureTask型であり、多くのデータが含まれていません。VideoExportThread実行中のインスタンスを識別し、その進行状況を照会するために、それを使用して元のインスタンスを取得する方法はありますか?

ありがとう

4

1 に答える 1

5

Runnablesのリストを単純に保持してみませんか?

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

executor.submit(r);また、を返すことに注意してください。Futureそのメソッドを呼び出してisDone()、送信されたタスクがまだ実行されているかどうかを確認できます。


補足コメント:ジョブキューを手動で管理するのには十分な理由があるかもしれませんが、そうでない場合は、ファクトリメソッドの1つを使用して作業を楽にしてください。例:ExecutorService executor = Executors.newCachedThreadPool();

于 2013-03-11T14:39:08.267 に答える