web-dev-qa-db-ja.com

スレッドを30分間スリープ状態にする

スレッドを30分間待つようにします。これを行うのに問題はありますか?

15
venkata lokesh

次のように、スレッドを30分間スリープさせることができます。

Thread.sleep(30 *   // minutes to sleep
             60 *   // seconds to a minute
             1000); // milliseconds to a second

Thread.sleep を使用することは本質的に悪いことではありません。簡単に説明すると、スレッドスケジューラにスレッドをプリエンプトするように指示するだけです。 Thread.sleepは、誤って使用された場合は不適切です。

  • (共有)リソースを解放せずにスリープする:スレッドが共有接続プールからのオープンデータベース接続またはメモリ内の多数の参照オブジェクトでスリープしている場合、他のスレッドは使用できませんこれらのリソース。スレッドがスリープしている限り、これらのリソースは無駄になります。
  • 競合状態を防ぐために使用:sleepを導入することにより、競合状態を実際に解決できる場合があります。しかし、これは保証された方法ではありません。ミューテックスを使用します。 Javaにミューテックスはありますか? を参照してください
  • 保証タイマーとしてThread.sleepのスリープ時間は保証されません。 InterruptedExceptionを使用して、途中で戻る可能性があります。または、寝坊する可能性があります。

    ドキュメント から:

    public static void sleep(long millis) throws InterruptedException
    

    現在実行中のスレッドを指定されたミリ秒数だけスリープ(一時的に実行を停止)させますシステムタイマーとスケジューラーの精度と精度に従います


kozla1 がコメントに示しているように、使用することもできます。

TimeUnit.MINUTES.sleep(30);
32
sampathsris

Krumiaの答えはすでに、実行中のThreadをスリープさせる方法を完全に示しています。スレッドをスリープまたは一時停止する要件は、後日操作を実行したいという要望から生じる場合があります。その場合は、TimerまたはScheduledExecutorServiceのようなより高いレベルの概念を使用する必要があります。

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(operation, 30, TimeUnit.MINUTES);

operationは、30分で実行するRunnableです。

ScheduledExecutorServiceを使用して、定期的に操作を実行することもできます。

// start in 10 minutes to run the operation every 30 minutes
executor.scheduleAtFixedDelay(operation, 10, 30, TimeUnit.MINUTES);
4
isnot2bad