私がやろうとしていることは次のとおりです。1つのボタンを押すと、単純な値が変更されます。値が 3 秒間変化しない場合、メソッドを実行したい。したがって、ボタンをクリックするたびに開始する(そして他のすべてを殺す)単一のスレッドが必要です。知っている
Executor executor = Executors.newSingleThreadScheduledExecutor();
しかし、遅れることはできません。これを行うためのベストプラクティスは何ですか?
私がやろうとしていることは次のとおりです。1つのボタンを押すと、単純な値が変更されます。値が 3 秒間変化しない場合、メソッドを実行したい。したがって、ボタンをクリックするたびに開始する(そして他のすべてを殺す)単一のスレッドが必要です。知っている
Executor executor = Executors.newSingleThreadScheduledExecutor();
しかし、遅れることはできません。これを行うためのベストプラクティスは何ですか?
ボタンがクリックされるとすぐにスレッドを開始し、最初の命令として実行し、値が変更されていないかどうかを確認しThread
ます。スレッドを開始する前に、別のスレッドが既に存在するかどうかを確認し、存在する場合はそれを呼び出して処理し、正常に終了します。Runnable
Thread.sleep(3000)
interrupt()
InterruptedException
新しい並行 API を使用する場合は、 が(単純な ではなく) をExecutors.newSingleThreadScheduledExecutor()
返す ことに注意してください。これにより、名前が示すように遅延を伴うスレッドの開始が可能になります。Javadocを確認してください。ScheduledExecutorService
Executor
単純なThread
スタートストップ/割り込みを使用するか、API のようなものを使用できますScheduledExecutorService
。
方法の例をScheduledExecutorService
以下に示します
//Start as many threads as you want upon button click... (since you said i want to kill all other threads, so i assume you want to start some threads soon upon button click)
ScheduledExecutorService service = Executors.newScheduledThreadPool(3);
service.schedule(new Thread(), 0, TimeUnit.SECONDS);
service.schedule(new Thread(), 0, TimeUnit.SECONDS);
service.schedule(new Thread(), 0, TimeUnit.SECONDS);
//Start single thread after 3 seconds.
ScheduledExecutorService serviceCheck = Executors.newScheduledThreadPool(3);
serviceCheck.schedule(new Thread(), 3, TimeUnit.SECONDS);
//In this thread created using "serviceCheck", check with value has not changed then use `service.shutdownNow();` to shutdown all previously started threads and then do whatever you want.