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

标签 java android multithreading sleep

此要求出现在我的 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/

相关文章:

java - 如何将 JavaFX 场景函数包含到 public static void main 中

java - java的TreeMap的效率是基于键还是值的数量?

java - 第二个并行流在完成第一个并行流之前启动

multithreading - 避免C中多个套接字的连接拒绝错误

Java 在不调试或打印时卡住

java - 如何使用 JMockIt 对 Log4j 进行单元测试?

android - 如何在 Android 中将 JSON ARRAY 数据发布到服务器

android - 在 Android 的 chrome 浏览器中创建自定义 tabhost

java - 使用 org.apache.commons.net.ftp.FTPClient 从 AsyncTask 类登录 FTP 时出错

java - 使用线程作为 "sessions"