我创建的JFrame
包含和InternalFrame
,其中绘制了正在移动的数字(每个数字是另一个Thread
)我想pauseButton
让它暂停,所以我想要在传递的对象上同步它们。
但是当我按下暂停按钮时,整个窗口都冻结了,我无法点击播放按钮 另一件事是当时只有一个正在运行,我希望它们都运行然后全部暂停。
class A extends JFrame{
....
Object o = new Object();
JButtton pauseButton = new JButton("pause");
JButtton playButton = new JButton("play");
B b = new B(o);
pauseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
synchronized (synchronizator) {
try {
synchronizator.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
playButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
synchronized (synchronizator) {
synchronizator.notifyAll();
}
}
...
}
class B extends JInternalFrame{
Object o;
B(Object o){this.o = o}
./...
many... C thread = new C(o);
....
}
class C extends Thread{
Object o;
booolean running;
public void run(){
while(running){
synchronized(o){
}
}
}
}
答案 0 :(得分:2)
NOOOO !! ;)
所有Swing活动都应该在AWT事件调度线程(EDT)上完成。使用普通线程无关的对象,可能javax.swing.Timer
(不是java.util
!)进行计时。
你可能想在不同的线程上做其他不涉及Swing的事情,但我建议保持一个非常干净的分离。也就是说,很少有对象应该处理线程问题。
如果您正在使用裸低级Java同步工具,请在notify
/ notifyAll
之前设置条件,并将wait
置于while
个循环内。< / p>