我正在使用java开发一个应用程序,它启动一些执行某些工作的线程并使用JTable
更新JProgressBar
。
我在JPopupMenu
上开发了一个JTable
JMenuItem
:
所以我希望能够做到。
当用户在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);
}
但是IllegalStateMonitorException
让我wait()
,所以我不知道该怎么做..有人能帮帮我吗?
答案 0 :(得分:1)
Thread.interrupt()
调用仅设置Thread
上的中断位,并导致任何wait
或sleep
次调用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
,而不是在您正在等待的对象的synchronized
块内。您需要执行以下操作:
Thread t = working.get(actualRow);
synchronized (t) {
t.wait();
}
虽然我不确定那是你想要的。也许你想加入等待它完成的线程?
working.get(actualRow).join();
答案 1 :(得分:1)
IllegalStateMonitorException
是因为线程只能在它拥有的对象中等待(我不记得它是否是正确的术语)。
您需要先通过同一个对象进行同步,以确保没有其他人在等待此对象。
synchronize (working.get(actualRow)) {
working.get(actualRow).wait();
}