2011-07-21 5 views
8

を停止します。FUNC()が呼び出されたときScheduledThreadPoolExecutorのは、私は次のコードを書かれている方法を実行可能なクラスJAVA

import java.util.Calendar; 
import java.util.concurrent.ScheduledThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 

class Voter { 
public static void main(String[] args) { 
    ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(2); 
    stpe.scheduleAtFixedRate(new Shoot(), 0, 1, TimeUnit.SECONDS); 
} 
} 

class Shoot implements Runnable { 
Calendar deadline; 
long endTime,currentTime; 

public Shoot() { 
    deadline = Calendar.getInstance(); 
    deadline.set(2011,6,21,12,18,00); 
    endTime = deadline.getTime().getTime(); 
} 

public void work() { 
    currentTime = System.currentTimeMillis(); 

    if (currentTime >= endTime) { 
     System.out.println("Got it!"); 
     func(); 
    } 
} 

public void run() { 
    work(); 
} 

public void func() { 
    // function called when time matches 
} 
} 

私はScheduledThreadPoolExecutorのを停止したいと思います。それがさらに働く必要はありません!私は、関数func()をVoterクラスの中に入れて、何らかのコールバックを作成する必要があると思います。しかし、おそらく私はShootクラスの中からそれを行うことができます。

どうすれば適切に解決できますか?

+0

私は 'ScheduledThreadPoolExecutor'についてよく知っているわけではありませんが、私の最初の推測は' stpe.shutdown() 'でしょう。 'stpe'を' func() 'から到達可能にする必要があります。デッドライン時に実行される第2のスレッド(スケジュール?)を開始し、 'shutdown()'関数を呼び出すことは合理的かもしれません。 – Dorus

答えて

20

ScheduledThreadPoolExecutorはすぐにタスクを実行したり、後で実行するようにスケジュールできます(定期的な実行も設定できます)。だから、

、あなたのタスクの実行は、このことを覚えておいて停止するには、このクラスを使用する場合:

  1. つのスレッドは、彼の実行を停止することを保証する方法はありません。 Thread.interrupt()のドキュメントを確認してください。
  2. メソッドScheduledThreadPoolExecutor.shutdown()は、キャンセルされたタスクとして設定され、スレッドを中断しようとしません。この方法では、実際には新しいタスクの実行や、スケジュールされているが開始されていないタスクの実行を避けることができます。私は、このリストの最初のポイントに言ったようにスレッドを中断しますが、ScheduledThreadPoolExecutor.shutdownNow()
  3. 方法...あなたは、スケジューラを停止したいときは

は、あなたがこのような何かをする必要があります。

//Cancel scheduled but not started task, and avoid new ones 
    myScheduler.shutdown(); 

    //Wait for the running tasks 
    myScheduler.awaitTermination(30, TimeUnit.SECONDS); 

    //Interrupt the threads and shutdown the scheduler 
    myScheduler.shutdownNow(); 

しかし、1つのタスクだけを停止する必要がある場合はどうすればよいですか?

メソッドScheduledThreadPoolExecutor.schedule(...)は、すでにスケジュールされたタスクの表現であるScheduleFutureを返します。したがって、ScheduleFuture.cancel(boolean mayInterruptIfRunning)メソッドを呼び出してタスクをキャンセルし、必要に応じて割り込みを試みることができます。

+5

私は上記のことを一つだけ明確にする必要があります:なぜ私たちは単に私のtheScheduler.shutdownNow()を実行できませんか?私の懸念が完了するためのタスクの終了を待っていることは、任意の時間を取る可能性があります。だからなぜ最初の2行に行くのですか? – abksrv

関連する問題