gpt4 book ai didi

java - 唤醒 sleep 线程 - interrupt() 与 "splitting" sleep 进入多个 sleep

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:49:24 32 4
gpt4 key购买 nike

此要求出现在我的 Android 应用程序中,但它通常适用于 Java。我的应用程序每隔几秒钟“做某事”。我已经按如下方式实现了这一点(只是相关的 fragment - 不是完整的代码):

fragment 1:

public class PeriodicTask {

private boolean running = true;
private int interval = 5;

public void startTask(){
while (running){
doSomething();
try{
Thread.sleep(interval * 1000);
} catch(InterruptedException e){
//Handle the exception.
}
}
}

public void stopTask(){
this.running = false;
}

public void setInterval(int newInterval){
this.interval = newInterval;
}
}

如您所见,此方法的问题在于 setInterval() 不会立即生效。它仅在前一个 sleep() 完成后才生效。

由于我的用例允许最终用户以固定步长(1 秒 - 从 1 到 60 秒)设置间隔,我修改了实现以在循环中 hibernate ;并每秒检查一次新的间隔值,如下所示:

fragment 2:

public class PeriodicTask {

private boolean running = true;
private int interval = 5;
private int loopCounter = 0;

public void startTask(){
while (running){
doSomething();
try{
while(loopCounter < interval) {
Thread.sleep(1 * 1000);
loopCounter ++;
}
} catch(InterruptedException e){
//Handle the exception.
}
}
}

public void stopTask(){
this.running = false;
}

public void setInterval(int newInterval){
synchronized (this) {
this.interval = newInterval;
if(newInterval < loopCounter){
loopCounter = 0;
}
}
}
}

是否有理由不使用这种方法?

我最近遇到了用于此目的的 interrupt() 方法。但是,我无法确切地弄清楚如何使用它。一方面,与 sleep 方法不同,中断方法不是static。那么,我要中断什么Thread

public void setInterval(int newInterval){
this.interval = newInterval;
//What thread do I call interrupt() on?
}

其次,如果我确实成功中断了 hibernate 的Thread,我相信InterruptedExceptioncatch block 将被执行。但是,此时我需要再次调用 startTask()。我对这个递归的终止感到困惑。我在 SO 上回答了几个关于使用 interrupt() 的问题,但找不到任何对我有帮助的东西。

有什么建议吗?


编辑 - 有关确切要求的更多详细信息:

我的应用每隔几秒使用 REST 调用获取一些值。更新间隔可由用户配置。

现在,假设更新间隔已设置为 60 秒。我发布的 Snippet1 将按如下方式(错误地)工作:

  • 线程 hibernate 60 秒。
  • 现在,假设用户将更新间隔更改为 5 秒。线程仍在 hibernate 。
  • PeriodicTask 只会在 60 秒过期后看到新的更新间隔。

确切的要求是新的更新间隔应该立即生效(或者至少在设置后不迟于 1 秒 - 因为这是用户可能无论如何都感知到的)。

我的 Snippet2 和 Snippet3 就是尝试实现这个需求。

最佳答案

IIRC,在 Java 中,您可以使用超时的 object.wait()。这不是你想要的吗?如果您想更改另一个线程的超时,请更改一些“waitValue”变量和 notify()。然后线程将“立即”运行,然后再次等待新的超时值。不需要明确的 sleep 。

关于java - 唤醒 sleep 线程 - interrupt() 与 "splitting" sleep 进入多个 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8708473/

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