我爲這個遊戲,我在這兒舉行一個甜蜜的系統更新功能是代碼:我需要關機ScheduledExecutorService的,但需要啓動它在需要時
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時,如何停止計劃程序的運行,但是當輸入數字>然後是0(幾次)時,如何啓動計劃程序。
我認爲你正在使用非常複雜的方式,只是延遲你的任務N秒。爲什麼不安排它在n秒後運行,而不是逐秒倒計時?順便說一句,我不會打擾開始/停止單個線程。讓它一直流連忘返。 –