在传递的对象上同步,JFrame正在冻结

时间:2013-05-02 10:40:56

标签: java multithreading swing synchronization wait

我创建的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){


       }
    }
    }

}

1 个答案:

答案 0 :(得分:2)

NOOOO !! ;)

所有Swing活动都应该在AWT事件调度线程(EDT)上完成。使用普通线程无关的对象,可能javax.swing.Timer(不是java.util!)进行计时。

你可能想在不同的线程上做其他不涉及Swing的事情,但我建议保持一个非常干净的分离。也就是说,很少有对象应该处理线程问题。

如果您正在使用裸低级Java同步工具,请在notify / notifyAll之前设置条件,并将wait置于while个循环内。< / p>