2012-05-24 73 views
0

我爲這個遊戲,我在這兒舉行一個甜蜜的系統更新功能是代碼:我需要關機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(幾次)時,如何啓動計劃程序。

+1

我認爲你正在使用非常複雜的方式,只是延遲你的任務N秒。爲什麼不安排它在n秒後運行,而不是逐秒倒計時?順便說一句,我不會打擾開始/停止單個線程。讓它一直流連忘返。 –

回答

2

一旦關機的ExecutorService無法再次啓動,因此移動它從變量聲明創建(和刪除決賽),做的是,在啓動方法來代替:

//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

如果您不關閉停止方法中的ExecutorService,則需要在某處調用關機,否則您的進程將永遠不會終止。 –