gpt4 book ai didi

java - 安全地暂停和恢复线程

转载 作者:行者123 更新时间:2023-12-01 17:03:06 25 4
gpt4 key购买 nike

我想创建一个线程来每隔几秒发出一些 HTTP 请求,并且很容易随时暂停和恢复。

下面的方式是首选方式吗,安全高效吗?

public class Facebook extends Thread {

public boolean running = false;

public void startThread() {
running = true;
}

public void stopThread() {
running = false;
}

public void run() {
while(true) {
while(running) {
//HTTP Calls
Facebook.sleep(2000);
}
}
}

}

最佳答案

您的代码:

在您的示例中,boolean 应该是 volatile boolean 才能正常运行。另一个问题是,如果您的线程只是在紧密循环中消耗 CPU,并且您可能需要使用对象监视器或 Condition实际上空闲地等待标志再次变为 true

计时器选项:

我建议简单地创建一个 Timer为了这。每个Timer 隐式地获取自己的线程,这就是您想要完成的任务。

然后创建一个 TimerTask (下面是 FacebookTask )来执行您的任务,并且从您的主控制类中,不需要显式线程,例如:

Timer t;

void resumeRequests () {
if (t == null) { // otherwise its already running
t = new Timer();
t.scheduleAtFixedRate(new FacebookTask(), 0, 2000);
}
}

void pauseRequests () {
if (t != null) { // otherwise its not running
t.cancel();
t = null;
}
}

请注意,上面的 resumeRequests() 将导致请求在恢复后立即发生(由 0 延迟参数指定);如果您在 2000 毫秒内反复暂停和恢复,理论上可以提高请求率。这对你来说似乎不是问题;但另一种实现是保持计时器持续运行,并在 FacebookTask 中有一个 volatile bool 标志,您可以设置它来启用/禁用它(因此,如果它是例如 false 它不会发出请求,但会继续每 2000ms 检查一次)。选择对您最有意义的一个。

其他选项:

您还可以使用scheduled executor service正如 fge 在评论中提到的那样。它比定时器具有更多的功能,并且同样易于使用;如果您将来需要添加更多任务,它们也可以很好地扩展。

无论如何,没有真正的理由在这里直接使用Thread; JDK 中有很多很棒的工具可以完成这项工作。

关于java - 安全地暂停和恢复线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26679163/

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