はい。 ScheduledExecutorService。 Executors.newScheduledThreadPool(corePoolSize)
で固定長のサービスを作成することができます。あなたは時間を待つためにタスクを送信する準備ができているときだけでタスクが提出されている時から1分後に起動します。ここScheduledExecutorService.schedule
ScheduledExecutorService e = Executors.newScheduledThreadPool(10)
private final long defaultWaitTimeInMinutes = 1;
public void submitTaskToWait(Runnable r){
e.schedule(r, defaultWaitTimeInMinutes, TimeUnit.MINUTES);
}
に提出してください。あなたの最後のポイントに対処する。現在タスクがダウンロードされている場合(この構成では、10個のタスクがダウンロードされていることを意味します)、1分後に実行された実行可能ファイルは、他のダウンロードが完了するまで待機する必要があります。
これは設計時のやり方から少しずれていることに注意してください。新しいタスクごとに新しいスレッドを作成するのではなく、既にスレッドが待機しているサービスにサブミットします。たとえば、一度に1つのタスクのみをダウンロードしたい場合は、からExecutors.newScheduledThreadPool(1)
に変更します。
編集:前回の回答はそのまま残しておきます。前のタスクが完了しました。 2つのExecutorServicesを使用します。 1人は評決されたエグゼクティブに提出し、もう1人はタイムリーな処刑を行います。最後に、最初のExecutorは完了を待機し、他のタスクがキューに入れられた状態で続行します。
ExecutorService e = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1)
public void submitTask(final Runnable r){
e.submit(new Runnable(){
public void run(){
ScheduledFuture<?> future= scheduledService.schedule(r, defaultWaitTimeInMinutes, TimeUnit.MINUTES);
future.get();
}
});
}
ここでfuture.get(); submitTaskによって送信された次のRunnableが完了し、1分間実行されます。最後に、これは、他のタスクがサブミットされていなくても、タスクが1分待つ必要がある場合にのみ機能します。
タスク/スレッドを追加した直後に開始する予定がある場合は、どのような時間パラメータですか? @β_ɛƨнǤʋяʋиAsは、複数のスレッドを必要とせず、スレッド化された単一のタスク実行プログラム(Executors.newSingleThreadExecutor())がそのジョブを実行するように見えます。 – Vlad
実行中のスレッドがなく、最後のスレッドがx秒前に終了した場合にのみ、スレッドはすぐに開始されます – DnBase