【问题标题】:Synchronizing on a passed object, JFrame is freezing在传递的对象上同步,JFrame 冻结
【发布时间】:2013-05-02 10:40:55
【问题描述】:

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


       }
    }
    }

}

【问题讨论】:

  • which draws figures which are moving(each figure is another Thread) 请问为什么,那些线程连接数据库,RMI,套接字,读取 FileIO ???,如果不是,那么只使用一个 Swing Timer 正如@Tom Hawtin 已经建议的那样 - tackline,吨代码这里的示例关于将所有(准备好的)对象放入数组并在paintComponent内部根据任何条件从数组中拾取对象

标签: java multithreading swing synchronization wait


【解决方案1】:

不! ;)

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

您可能想要在不同线程上执行不涉及 Swing 的其他事情,但我建议保持真正干净的分离。也就是说,很少有对象应该处理线程问题。

如果您使用的是低级 Java 同步工具,请在 notify/notifyAll 之前设置一个条件,并将您的 waits 放入 while 循环中。

【讨论】:

  • 以及为什么在官方 API 中实现 SwingWorker 的原因
  • @mKorbel 你这是什么意思? SwingWorker 已经在 J​​ava 库中多年了。但是,我不会推荐它,因为它会将您的代码不必要地捆绑在一起。
  • 如果我在 A 类中有一个 ActionListener 并且我想在 C 类中暂停 run(),您能否说明如何使用该计时器。(主帖)
猜你喜欢
  • 2013-02-03
  • 2012-02-11
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多