我需要关闭ScheduledExecutorService,但需要在需要时启动它

时间:2012-05-24 19:40:29

标签: java multithreading shutdown executorservice

我为这个游戏制作了一个甜蜜的系统更新功能,我在这里制作代码:

public static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private static CountDownThread countDownThread;
public static boolean running = false;

private static short updateSeconds;


public static void start() {
    System.out.println("starting");
    running = true;
    countDownThread = new CountDownThread();
    scheduler.scheduleWithFixedDelay(countDownThread, 0, 1000, TimeUnit.MILLISECONDS);
}

public static void stop() {
    System.out.println("Stoping");
    scheduler.shutdown();
    running = false;
    updateSeconds = 0;
    System.out.println("Stopped");
}

public static void refresh() {
    for (Player p : Static.world.players){ 
        if (p.ready()) {
            if (updateSeconds > 0) {
                ActionSender.sendSystemUpdate(p, updateSeconds+1);
            } else {
                ActionSender.sendSystemUpdate(p, updateSeconds);
            }
        }
    }
}

public static short getUpdateSeconds() {
    return updateSeconds;
}

public static void setUpdateSeconds(short updateSeconds) {
    SystemUpdateHandler.updateSeconds = (short) (updateSeconds);
}

public static class CountDownThread implements Runnable {

    @Override
    public void run() {
        System.out.println(updateSeconds);
        updateSeconds--;
        if (updateSeconds <= 0) {
            Static.server.restart();
            scheduler.shutdown();
            running = false;
        }
    }

}

}

就是这样,当系统更新计数器达到0时,服务器将重新启动它自己。它工作正常,但问题开始的地方

    case "update":
        if (Short.parseShort(txtSystemUpdate.getText()) != 0) {
            SystemUpdateHandler.setUpdateSeconds(Short.parseShort(txtSystemUpdate.getText()));
            SystemUpdateHandler.refresh();
            if (!SystemUpdateHandler.running) {
                SystemUpdateHandler.start();
            }
        } else {
            SystemUpdateHandler.stop();
            for (Player p : Static.world.players){ 
                if (p.ready()) {
                    ActionSender.sendSystemUpdate(p, 0);
                }
            }
        }
        break;

这就是我所说的,基本上如果我输入一个高于0的数字,程序运行正常。但我希望如此,如果我输入数字0,调度程序将停止运行(以节省内存),因为除非我发送系统更新,否则它不需要。基本上,当我输入0时,如何停止调度程序运行,但是当我输入数字&gt;时能够将其重新启动。然后0(几次)。

2 个答案:

答案 0 :(得分:2)

一旦关闭,ExecutorService就无法再次启动,所以从变量声明中移除它的创建(并删除final),而不是在start方法中执行:

//not static and not final, normal instance variable instead:
public ScheduledExecutorService scheduler;
...

//and create it in the start method isntead:
public static void start() {
    System.out.println("starting");
    scheduler = Executors.newSingleThreadScheduledExecutor();
    ...

答案 1 :(得分:1)

关闭时,您将获得提交给调度程序的任务列表,您可以使用此列表创建新列表。调度程序一旦停止就无法启动 - 因为线程池已经死亡,所有工作线程也都已死亡。