2012-10-19 80 views
1

基本上,我有一個運行在控制檯中的Java線程,這個線程將無限移動,除非用戶輸入「halt」,程序應該停止線程並停止控制檯。如何在用戶命令停止的Java命令提示符中停止線程?

這裏就是線程樣貌似的set_interval部分(用戶可以給的輸入他們是如何的間隔長要在線程之間):

public void set_interval(int mins, int secs) { 
    time = (mins * 60000) + (1000 * secs); 
    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     public void run() { 
      try { 
       count += counter; 
       String name = getName(); 
       Date date = new Date(); 
       System.out.print("\n" + "Thread:" + name + " " + date + " - counter: " + count); 
       Thread.sleep(time); 
      } catch(InterruptedException e){ 
       System.out.print(e); 
      } 
    }, 0, time);  
} 

,這裏是什麼樣的主要款式:像: }else if (checkLine.equals("halt")){ Thread test = new Thread("name"); test.interrupt(); break; }

我看每個地方說要使用中斷,但這個中斷似乎並沒有工作。任何人有任何想法?或者我只是忽略了一些小細節?有機會我需要使用套接字來解決這個問題。

回答

0

中斷只會中斷您中斷的線程。在你的代碼中你創建了一個你打斷的線程,但是沒有其他的線程會受到影響。

除了記錄中斷之外,您可以中斷定時器中的線程,但繼續執行,就好像它沒有發生,即不會停止線程。

我會爲此使用ScheduleExecutorService,因爲它支持shutdownNow(),它會停止線程池並中斷所有正在運行的任務。

+0

我不使用可運行,可我還是用ScheduleExecutorService? – user1758415

+0

您可以將run()方法中的內容放入Runnable中,並刪除Thread.sleep,因爲它不需要。 –

0

爲什麼不將定時器移出函數並進入類範圍?然後致電timer.purge()timer.cancel()? - 但堅持!他們只停止/取消所有非活動任務。目前正在執行的任務將永遠不會停止。

您正試圖停止當前正在執行的任務。一個更簡單的方法是: 有一個AtomicBoolean dontKeepRunning變量,當您想要終止任務時,您將其設置爲true。

像這樣:

private AtomicBoolean dontKeepRunning; 
public YourTimerTask(){ dontKeepRunning = new AtomicBoolean();} 
public void halt() 
{ 
    dontKeepRunning.set(true); 
} 
public void set_interval(int mins, int secs) { 
    time = (mins * 60000) + (1000 * secs); 
    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     public void run() { 
      try { 
       count += counter; 
       String name = getName(); 
       Date date = new Date(); 
       System.out.print("\n" + "Thread:" + name + " " + date + " - counter: " + count); 
       while(dontKeepRunning.get() == false){} 
       return; 
      } catch(InterruptedException e){ 
       System.out.print(e); 
      } 
    }, 0, time);  
} 
+0

當我在我的主要Java類中調用(ThreadName).halt()時,它仍然不會阻止線程繼續... – user1758415

+0

@ user1758415試試這個嗎? –

0

問題Thread.interrupt在所有的線程。而這些線程必須support interruption。基本上,線程必須:

  1. 試驗中斷標誌不時,例如與Thread.currentThread.isInterrupted()
  2. 完成對接收InterruptedException