延迟启动的单线程
Single thread with a delay to start
我想做的是:按一个按钮更改简单值。如果值在 3 秒内保持不变,我想执行我的方法。所以我需要一个线程,它会在每次单击按钮时启动(并杀死所有其他线程)。我知道
Executor executor = Executors.newSingleThreadScheduledExecutor();
但它不能有延迟。这样做的最佳做法是什么?
您可以简单地使用旧的 Thread
class 或 Runnable
界面:单击按钮后立即启动线程,执行 Thread.sleep(3000)
作为第一条指令,然后检查该值是否未更改。
在启动线程之前检查是否已经存在另一个线程,如果存在,调用 interrupt()
并处理 InterruptedException
以优雅地终止它。
如果你想使用较新的并发 API,请注意 Executors.newSingleThreadScheduledExecutor()
returns a ScheduledExecutorService
(不是简单的 Executor
)并且它允许顾名思义,延迟启动线程。检查 Javadoc.
要么你可以使用简单的 Thread
start-stop/interrupt,要么你可以使用 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.
我想做的是:按一个按钮更改简单值。如果值在 3 秒内保持不变,我想执行我的方法。所以我需要一个线程,它会在每次单击按钮时启动(并杀死所有其他线程)。我知道
Executor executor = Executors.newSingleThreadScheduledExecutor();
但它不能有延迟。这样做的最佳做法是什么?
您可以简单地使用旧的 Thread
class 或 Runnable
界面:单击按钮后立即启动线程,执行 Thread.sleep(3000)
作为第一条指令,然后检查该值是否未更改。
在启动线程之前检查是否已经存在另一个线程,如果存在,调用 interrupt()
并处理 InterruptedException
以优雅地终止它。
如果你想使用较新的并发 API,请注意 Executors.newSingleThreadScheduledExecutor()
returns a ScheduledExecutorService
(不是简单的 Executor
)并且它允许顾名思义,延迟启动线程。检查 Javadoc.
要么你可以使用简单的 Thread
start-stop/interrupt,要么你可以使用 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.