正如我已经提到的,我对编程世界很陌生。 我目前面临可运行的问题。当我检查布尔关闭的状态时,代码一直在运行,而不是每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);
}
}
编辑:我需要以某种方式阻止该方法运行,这就是我使用布尔关闭的原因。
答案 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
。