2016-02-05 80 views
0

我写了一个小样本代码:多线程:上下文切换

public class Button2 implements Runnable{  
    JButton jButton = new JButton(); 
    static boolean changeContext = false;  
    public Button2(){ 
     jButton.setText("ButtonTWO"); 
     jButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       changeContext = true; 
       ((JButton)e.getSource()).setEnabled(false); 
      } 
     }); 
    } 
    @Override 
    public void run() { 
     System.out.println("ButtonTWO run..."); 
     jButton.setEnabled(true); 
     while(true){ 
      if(changeContext) 
       break; 
     } 
     changeContext = false;   
    } 
} 

当我运行它想:

Button2 threadTWO = new Button2(); 
Thread thread2; 
      try{ 
       thread2 = new Thread(threadTWO); 
      thread2.start(); 
      thread2.join(); 
      }catch(Exception ex){ 
       System.out.println("Ëxception caught"); 
      } 

它从来没有出来,即使点击了按钮之后。

如果我在while(true) in run method之后加上一个sysoutThread.sleep(1),它会出现while循环。可能的原因是什么?

回答

0

我假设你正在运行EDT的底部。因此,您正在创建按钮(并希望以某种方式将其添加到您的用户界面中),然后启动线程并使EDT等待线程死机(thread2.join()),因此EDT无法处理事件,并且changeContext = true永远不会被调用。

,添加的东西,使循环的结束可能是由于缺少括号:

这只是结束循环,如果changeContext是真实的:

if(changeContext) 
    break; 

我认为你这样做:

if(changeContext) 
    Thread.sleep(1); 
    break; 

上述调用睡眠,如果changeContext为真,然后立即结束循环(break不在if区块anymo回覆。所以,如果你想一致的行为,写这样的:

if(changeContext) { 
    Thread.sleep(1); 
    break; 
} 

顺便说一下,苹果公司去年基本上也有类似的源(双break并没有括号)有一个安全问题。

+0

它在while(true){Thread.sleep(1); if(....)}之后添加Thread.sleep时起作用 –