2014-04-04 68 views
0

在我的程序中,有一個按鈕「Display」,另一個按鈕「Reset」。 用戶在文本字段中輸入他們想要的素數的數量,然後單擊「顯示」按鈕。然後,第一個x素數將出現在文本區域中。重新設置新線程

在代碼中,我有: 聲明:

Thread go; 
Thread newThread; 
JLabel howManyLabel; 
JTextField howMany; 
JButton display; 
JButton reset; 
JTextArea primes; 

操作事件:

public void actionPerformed(ActionEvent event) { 
    Object source = event.getSource(); 

    if (source == display) { 
     display.setEnabled(false); 
     if (go == null) { 
      go = new Thread(this); 
      go.start(); 
     } else { 
      newThread = new Thread(this); 
      newThread.start(); 
     } 
    } else if (source == reset) { 
     display.setEnabled(true); 
     howMany.setText(" "); 
     primes.setText(" "); 
    } 
} 

Run方法:

public void run() { 
    int quantity = Integer.parseInt(howMany.getText()); 
    int numPrimes = 0; 
    int candidate = 2; // candidate = the number that MIGHT be prime 

    primes.append("First " + quantity + " primes:"); 
    while(numPrimes < quantity) { 
     if (isPrime(candidate)) { 
      primes.append(candidate + ", "); 
      numPrimes++; 
     } 
     candidate++; 
    } 
} 

的run()方法是在同類,並簡單地計算素數的前x個數量。

我試圖每次調用「重置」按鈕時創建一個新的線程。線程第一次運行,但在單擊「重置」後不會再運行。 run()方法只能工作一次嗎?

在此先感謝。

+1

不,每次啓動線程時都會運行run方法。也許'run()'中的代碼需要重新初始化? – Gray

+0

run()中的代碼是做什麼的? – csharpwinphonexaml

+0

請爲'display,go,newThread,howMany,primes'和'run'的主體添加成員變量聲明,以便我們能夠理解正在發生的事情... – japreiss

回答

0

run()方法就像任何其他方法一樣,可以調用任意次數。無法多次調用的方法是start()(根據Thread)。

您的解釋似乎不符合您提供的代碼。你說你想在用戶點擊重置時產生一個新線程,但是如果源是Display,你只會構造或啓動線程。你的意思是,你想取消最後一個線程併爲用戶啓用控件以重新啓動?在這種情況下,您應該使用Future,而不是通用線程。

另一件事是UI組件通常不是線程安全的。 Swing在每個組件JavaDoc上明確警告它。你可能會看到的只是組件不更新其可見狀態時,從不同的線程更改。您是否嘗試過使用調試器來查看一個線程是否實際上不會生成,或者正在生成,但沒有您想要的結果?

+0

我將如何使用未來? – vmck

+0

您將創建並運行其中一個實現類。 如果使用Swing,你可以創建一個[SwingWorker](http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html),你可以在其中實現'doInBackground()',將是主要的工作量。每次它發現一個新的素數時,它都會使用'publish'將它提供給EDT。然後它會在EDT(GUI線程)的已發佈位上調用「process」,並用新的數字更新文本區域。當它完成時,它會再次調用EDT上的'done',完成線程。它也有一個取消方法來停止。 – Ordous

+0

其他選項包括使用'ScheduledExecutorService',它實際上取決於您正在使用的框架和庫。 主要問題仍然存在 - 調試器告訴你什麼? Thread是否會產生問題,或者產生了什麼問題? – Ordous