2014-10-17 55 views
0

這是我在Stackoverflow上的第一篇文章,顯然我沒有太多有關線程的知識。 它的控制檯應用程序和事情是,當主要方法啓動時,也啓動計時器和我的程序執行,它涉及從鍵盤獲取信息,它的工作很好。在定時器到期後調用並啓動一個新線程

計時器到期後,讓我們說20秒後,它從RemindTask類調用run(),並顯示我在那段時間收集的點數。 現在,我想使選項開始不再啓動我的應用程序,主要方法。

東西是我的主要還是從鍵盤收集信息導致其仍然執行,而不是從我想要的run()方法輸入。 如果我把System.exit(0),當然我不能啓動一個新的線程後。 我如何獲得通過這個,有沒有辦法在我的while循環說「直到我的計時器沒有過期做到這一點」?或者其他的東西?

static class RemindTask extends TimerTask { 
     public void run() { 
      char answer; 
      System.out.println("Time expired! "+yourResult); 
      /* System.exit(0); 
       Thread t = new Thread(); 
       t.start(); */ 
      System.out.println("Do you continue? y/n"); 
      Scanner in = new Scanner(System.in); 
      answer = in.nextLine().charAt(0); 
       if(answer=='y'){ 
       System.out.println("Continue program"); 
       String[] args = {}; 
       Main.main(args); 
       }else 
       System.out.println("Stoping program"); 
       System.exit(0); //Stops the AWT thread (and everything else) 
     } 

     } 

static int yourResult; 
public static void main(String[] args) { 

     int seconds=20; 
     timer = new Timer(); 
     timer.schedule(new RemindTask(), seconds * 1000); 
     boolean contin = true; 


     while(contin == true){ 

     //...a bunch of code... 
     //...Scanner in = new Scanner(System.in);.. 
     //...a bunch of code... 

     } 

回答

1

停止線程並不是一項簡單的任務。如何停止線程的簡短答案是:不要停止另一個線程內的線程;相反,要求線程自行停止。原因是線程必須在安全的地方停下來。例如,如果停止的線程持有互斥鎖,例如,如果另一個線程也需要此互斥鎖,則可能發生死鎖。

首先,可能最好不要使用主要方法來輪詢鍵盤。只需創建另一個線程來執行此操作;這可以讓後來做一個新的線程更容易做同樣的事情。

第二,你需要做的是將對主線程的Thread對象的引用傳遞給你的​​線程。 Java提供了一種方法Thread.stop()來停止線程,但由於我上面給出的原因,它已被棄用。

相反,您必須要求主線程停止。 Java爲此提供了一種標準方法。您在主線程的Thread實例上調用Thread.interrupt()。然後,在主線程中,您經常使用靜態方法Thread.interrupted()。如果它返回true,這意味着其他一些線程已經要求當前線程終止,並且您可以通過從run()方法返回來乾淨地停止。

+0

謝謝,我會在稍後嘗試,但有沒有辦法做到這一點,因爲它看起來像是一個簡單的任務:「在計時器到期後再次通過鍵盤輸入重新啓動程序」而不是在玩線程? 我不能看到它的方式。 沒有鍵盤輸入'y'很簡單,它只是在_System.out.println(「Time expired!」+ yourResult)之後再次調用main; _但是用這個輸入的東西確實是一個討厭的東西。 – Neonlight 2014-10-17 17:44:14

+0

_「你在主線程中調用Thread.interrupt(),然後在主線程中......」_ - 你是不是指生成的/其他線程或類似的東西? – Blogueira 2015-08-10 18:15:46

+0

@DanielGomes不,它的意思是它寫的,儘管我可以寫得更清楚。我已經重新配製了一下。 – Hoopje 2015-08-10 20:22:14

0

沒有調用RemindTask.run()方法,很難得到問題所在。在代碼的註釋部分中,在main方法循環中,您有一個也在RemindTask.run()中的構造函數調用。也許這是問題的一部分?

+0

我不知道你是什麼意思,或者我理解了答案,在我的代碼在主要方法循環內的註釋部分,我有一堆正在工作的代碼。 我會盡力解釋更好。 方法和鍵盤輸入在我的while循環中執行,20秒後調用RemindTask.run()和sayz _System.out.println(「Time expired!」+ yourResult); _ _System.out.println(「Do you繼續?y/n「); _ 當我嘗試插入'y'因爲我想重複我的程序,它仍然收集鍵盤輸入的方法在我的while循環在main中,而不是將它存儲在** char答案* * – Neonlight 2014-10-17 17:18:40

+0

這似乎是你正在使用System.in打開兩個掃描儀。這很奇怪。 – batrakius 2014-10-17 20:43:37

相關問題