2013-05-02 20 views
0

我创建JFrame其中包含和InternalFrame其中提请其移动数字(每个数字是另一个Thread)我想pauseButton让它暂停,所以我想给他们传递的对象上同步。同步一个传递的对象上,JFrame的被冻结

但是当我点击暂停按钮时,整个窗口冻结,我不能按下播放按钮 另一件事是当时只有一个正在运行,我希望它们全部运行,然后全部暂停。

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

'其中提请其移动(每个数字是另一个线程)的数字'请为什么,是连接数据库的线程,RMI,插座,阅读FileIO专注???,如果没有则只能使用一个作为已经被@建议摇摆定时器汤姆Hawtin - tackline,这里大约把所有(准备)对象数组和里面的paintComponent到pick_up无论基于何种条件 – mKorbel 2013-05-02 11:48:29

回答

2

NOOOO! ;)

所有Swing活动应在AWT事件指派线程(EDT)来完成。使用正常线程不可知的对象,也许javax.swing.Timer(不java.util!)进行计时。

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

如果您使用的是裸低级别的Java同步设施,设置之前notify/notifyAll的条件和内while循环把你wait秒。

+0

和原因SwingWorker的官方API – mKorbel 2013-05-02 11:20:08

+0

实现从数组对象@mKorbel你是什么意思的那些吨的代码示例?多年来,SwingWorker一直在Java库中。但是,我不会推荐它将您的代码捆绑在一起。 – 2013-05-02 11:23:31

+0

能否请您介绍如何使用定时器,如果我有A类一ActionListener的,我想暂停'的run()'类C.(主后) – Yoda 2013-05-02 11:23:44

相关问题