使用Thread.sleep()循环给定时间的任务

时间:2015-04-24 18:14:56

标签: java multithreading

我目前有一个方法我想循环一段时间。我试过创建这样的两个线程

            Thread t = new Thread();
            t.start();
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(length);
                        t.interrupt();
                    } catch (InterruptedException ex) {
                    }
                }
            };
            Thread s = new Thread(r);
            s.start();

            while(!t.isInterrupted()){
                runCurrentPres(current);
            }

但是我似乎无法打破循环,因为某种原因,它永远不会被打断。

3 个答案:

答案 0 :(得分:3)

isInterrupted方法实际上比hasPendingInterruptionwasEverInterrupted。当在该线程中抛出InterruptedException时,该标志会自动清除(只能在某些点发生,例如在您呼叫睡眠时),或者如果有人调用interrupted()(与{{1}不同}})。

阅读official Java tutorial on Interrupts了解详情。

已退出的线程无法暂停中断。

但是,这不是限制主线程运行时间的好方法。检查每次迭代的时间都可以达到你想要的效果:

isInterrupted()

请注意,这只会在每个long end = System.currentTimeMillis() + length; while(System.currentTimeMillis() < end){ runCurrentPres(current); } 调用之间进行检查,因此如果该函数需要很长时间才能执行,那么您的循环将比预期稍晚完成。但是,这与原始代码的相同行为相同。

答案 1 :(得分:2)

那么这个呢?

long time = System.currentTimeMillis();
while (time + length > System.currentTimeMillis()) {
    runCurrentPres(current);
}

无需使用线程。

答案 2 :(得分:0)

使用你的建议我去了

long end = System.currentTimeMillis() + length;
while(System.currentTimeMillis() < end){
    runCurrentPres(current);
}

如注释中所述,由于for循环,runcurrent需要时间来执行。因此我在for循环的每次迭代之前改变了要检查的解决方案,它最终像这样,并且按预期工作

long time = System.currentTimeMillis();
    while (time + length > System.currentTimeMillis()) {
        files = updateFiles(current);
        for (File f : files) {
            if(time + length < System.currentTimeMillis()){
                break;
            }

是的,在线程中使用while(true)的解决方案使用70%cpu