Java - Runnable混乱

时间:2016-08-07 11:30:45

标签: java

正如我已经提到的,我对编程世界很陌生。 我目前面临可运行的问题。当我检查布尔关闭的状态时,代码一直在运行,而不是每30秒预期一次。 到目前为止我的代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TestClass {
static boolean shutdown;


public static void main(String[] args) {


    notify(30);
}

private static void notify(int num) {

    Runnable runner = new Runnable() {
        public void run() {
            while(!shutdown){
            System.out.println("running");
        }
    }
    };

    ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
    exec.scheduleAtFixedRate(runner, 0, num, TimeUnit.SECONDS);
}

}

编辑:我需要以某种方式阻止该方法运行,这就是我使用布尔关闭的原因。

2 个答案:

答案 0 :(得分:2)

while循环导致线程永远旋转。我打赌你的计算机在运行时显示100%的核心使用率。

ScheduledExecutorService.scheduleAtFixedRate会返回ScheduledFuture<?>个对象。您需要做的是在其上调用cancel()以停止执行任务。

您需要删除while循环并取消ScheduledFuture<?>

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

我把它输入记事本 - 它可能无法编译,但你应该明白这一点。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TestClass {
static ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
static boolean shutdown = false;


public static void main(String[] args) throws Exception {
     new ShutdownChecker(30);
     Thread.sleep(90_000);
     shutdown = true;
}

private static class ShutdownChecker implements Runnable
{
    private final ScheduledFuture<?> future;

    public ShutdownChecker(int time)
    {
        future = TestClass.exec.scheduleAtFixedRate(this, 0, num, TimeUnit.SECONDS);
    }

    public void run()
    {
        if(TestClass.shutdown)
        {
            future.cancel();
            System.out.println("not running");
            return;
        }

        System.out.println("running");
    }
}

}

答案 1 :(得分:-1)

ScheduledExecutorService会在指定的时间段后将Runnable个实例从Thread传递到可用的ThreadPool