2012-03-22 109 views
2

我正在開發一個java應用程序,啓動一些線程來完成一些工作,並用JProgressBar更新JTable。 我就下發展的JTable一個JPopupMenu,有一些JMenuItem如何停止,暫停,取消java中的線程

  • 暫停
  • 停止
  • 取消
  • 恢復

所以我希望能夠做到這一點。

當用戶添加新的線程在JTable我保存在ArrayList<Thread>線程,所以我要實現

stop.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 

      } 
     }); 

和其他..

,所以我嘗試,與我有假說當前線程的索引:

Thread t = working.get(selectedThread); //where working is my `ArrayList<Thread>` 
t.interrupt(); 

但沒有..它繼續工作...... ,所以我嘗試:

try { 
         working.get(actualRow).wait(); 
        } catch (InterruptedException ex) { 
         Logger.getLogger(PannelloRicerca.class.getName()).log(Level.SEVERE, null, ex); 
        } 

但它讓我IllegalStateMonitorExceptionwait(),所以我不知道該怎麼辦..有人可以幫助我嗎?

+0

您需要鎖定working.get(actualRow)對象才能調用wait。這就是你得到IllegalStateMonitorException的原因。可以從同步塊或同步方法調用等待。而不是在線程上使用中斷調用,通過設置線程的某個變量向線程發送通知。並且在線程中使用這個值來停止執行 – Delta 2012-03-23 02:56:01

回答

1

Thread.interrupt()通話只設置在Thread中斷位,它會導致任何waitsleep電話扔InterruptedException。它並不像許多人期望的那樣取消線程的執行。

可以測試在這樣一個線程中斷位:

while (!Thread.currentThread().isInterrupted()) { 
    ... 
} 

爲鄉親停止一個線程的典型方法是有一個AtomicBoolean(或volatile boolean),並做一些事情,如:

AtomicBoolean running = new AtomicBoolean(true); 
while (running.set()) { 
    ... 
} 

... 
// then in the other thread (like the main thread) you stop the thread by: 
runner.set(false); 

您正在獲取IllegalStateMonitorException,因爲您正在調用wait而不在​​塊的內部,因爲您正在等待的對象。您需要執行以下操作:

Thread t = working.get(actualRow); 
synchronized (t) { 
    t.wait(); 
} 

雖然我不確定那是您想要的。也許你想加入等待它完成的線程?

working.get(actualRow).join(); 
+0

問題是我的i-thread的作業(我的意思是說有很多線程工作在togheter)會解析兩個innested循環中的一些html頁面。所以我可以把你的條件嗎? – JackTurky 2012-03-22 23:56:24

+0

@Jack的目標是什麼?你是否試圖停止處理這個html頁面?你明顯可以每隔一段時間做一次。 – Gray 2012-03-22 23:59:58

+1

不..我沒有解釋好..我有一個Jpanel,我有一個JTable和一個JComboBox。用戶可以選擇一個對象到JCombobox中,然後點擊一個JButton就可以啓動一個線程。這個線程首先更新JTable,添加一行,裏面有一些文本和一個JProgressBar(由剛剛啓動的線程操作),然後解析許多HTML頁面,在每個頁面上,一些文本和JProgressBar的值插入JTable 。用戶可以啓動多個線程,然後點擊鼠標右鍵在一行JTable上顯示我的文章中描述的JPopupMenu。 – JackTurky 2012-03-23 00:09:14

1

IllegalStateMonitorException是因爲一個線程可以在它,它「擁有」(我不記得,如果它是正確的術語),它的對象只能等待。

您需要先通過同一個對象進行同步,以確保沒有其他人已經在等待此對象。

synchronize (working.get(actualRow)) { 
    working.get(actualRow).wait(); 
} 
+0

它阻止所有線程以這種方式.. – JackTurky 2012-03-22 23:58:18

+0

對不起..它塊所有GUI – JackTurky 2012-03-23 00:49:07

+0

只有一個線程可以位於給定對象的同步部分中。如果在對象中進行同步,則另一個線程嘗試與同一個對象同步,第二個將停止,直到第一個線程離開同步塊。這正是同步的目的。如果您只想在不阻塞問題的情況下進行等待,請使用不同的對象(新創建的對象,甚至是自己的Thread對象)同步每個線程。 – SJuan76 2012-03-23 08:58:02