2013-05-02 42 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

相關問題