2012-03-22 112 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