2016-09-07 5 views
0

私は20秒ごとに実行するタスクを持っています。しかし、問題は、タスクが中断を引き起こすように遅延をかけることができるということです。スケジュールされたスレッドがタスクを完了したかどうかをチェックする方法は?

package client; 

import java.util.concurrent.ScheduledThreadPoolExecutor; 
import static java.util.concurrent.TimeUnit.*; 

import java.util.Date; 

public class Bootstrap 
{ 
    public static void main(String[] args) 
    { 
    addThreadsToPool(); 
    ServiceTest service1 = new ServiceTest(); 
    } 

    public static void addThreadsToPool() 
    { 
    ScheduledThreadPoolExecutor eventPool = new ScheduledThreadPoolExecutor(5); 

    eventPool.scheduleAtFixedRate(new Updater(), 2, 20, SECONDS); 

    try { 
     Thread.sleep(20000); 
    } catch (InterruptedException ignored) { 
    } 
    } 
} 

この例では、クラスアップデータは20秒ごとに実行されますが、updaterの実行に20秒以上の時間がかかる場合は問題です。 次回のスケジュール実行前にUpdaterがタスクを終了させる方法は?

+1

'Updater'が完了していなければ_cancel_したい場合は、' scheduleAtFixedRate'によって返された 'Future'を使用し、' Updater'をキャンセルに敏感にすることで(Updaterの中断状態に注意して)現在のスレッド)。 –

+0

アップデーターがタスクを完了していない場合、アップデーターを取り消し、このタスクを実行するために時間を因子に掛けてより多くの時間を割り当てると、未来の部分をもっと説明してくれますか? –

+0

2つの 'Updater'ジョブが同時に実行されないようにしようとしていますか? – Gray

答えて

0

Updaterが20秒以内に完了するようにコードを作成する以外に方法はありません。厳密に言うと、スレッドがCPUからスケジュールされたり、長いGC一時停止が発生するなどの理由で、これは不可能です。タスク内でループを実行すると、周期的に時間をチェックし、デッドラインに達した場合に中止できます。

関連する問題