gpt4 book ai didi

java - 为线程编写一个舒适的暂停/停止方法

转载 作者:行者123 更新时间:2023-11-30 02:03:01 26 4
gpt4 key购买 nike

对于 Java 中的 Thread 子类,我试图编写一个方法 checkPauseAndStop(),其目的是成为一个很好的单行代码,我可以在 run() 中定期调用code> 方法来检查是否有暂停/停止请求并采取相应措施。

虽然功能齐全,但停止线程是通过 InterruptedException 处理的,这会强制 run() 代码处于 try-catch 中,并且感觉容易出错
(例如 Thread. sleep() 不会再告诉你它可能会抛出这样的异常)。

是否有任何好的方法可以在方法内部处理停止线程而不妨碍 run() 方法?

代码示例:

public class SuspendableThread extends Thread
{
private Semaphore lock = new Semaphore(1);
public void checkPauseRequest() throws InterruptedException
{
if (isInterrupted())
throw new InterruptedException();

lock.acquire();
lock.release();

}

@Override
public void run()
{
try
{
while (true)
{
// Do_stuff
checkPauseRequest();
}

}
catch (InterruptedException e)
{
return;
}
}

当然,在这个特定的例子中,它根本没有必要。为了获得更好的效果,假设我们有 50 个或更多连续的 block

// Do_stuff
checkPauseRequest();

而不是只有一个。

最佳答案

我会使用 ScheduledExecutorService 来构建它(您可以使用 Executors.newSingleThreadScheduledExecutor 创建)和 enum RunningState { RUNNING, PAUSED, STOPPED } .

虽然状态是RUNNING ,我们继续安排延迟任务(使用 ScheduledExecutorService.schedule )。每个任务都会检查我们是否仍然是 RUNNING ,如果是,则将单个循环迭代排入队列(使用 ExecutorService.submitExecutor.execute )。然后,它为下一次迭代安排一个新的延迟任务(与 Timer 不同,您可以使用它来代替,但代价是另一个线程)。

如果状态是PAUSED ,我们继续安排延迟的任务以继续检查是否转换回 RUNNING状态。但我们不会为实际循环迭代安排工作项。

如果状态是STOPPED然后我们停止安排任何更多延迟的任务。

状态变量可以存储在简单的 volatile 中字段,它可以是静态的(如果只有其中之一),也可以包装在代表“线程”的对象中(实际上不再是单个线程,但从调用者的角度来看可以类似于一个线程) .

关于java - 为线程编写一个舒适的暂停/停止方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52191666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com