2016-02-05 3 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"); 
      } 

Он никогда не выходит, даже после того, как кнопка, нажав кнопку.

Если я добавлю sysout или Thread.sleep(1) после while(true) in run method, он выходит из цикла while. Какова может быть возможная причина?

ответ

0

Предполагаю, что вы используете нижнюю часть на EDT. Таким образом, вы создаете кнопку (и, надеюсь, добавите ее к своему ui каким-то образом), затем запустите поток и сделайте EDT дождитесь окончания потока (thread2.join()), поэтому EDT не сможет обработать события и changeContext = true никогда не вызывается.

что-то добавить делает конец цикла, вероятно, из-за отсутствия скобок:

Это только заканчивает цикл, если changeContext верно:

if(changeContext) 
    break; 

Я предполагаю, что вы сделали это:

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

Вышеупомянутые вызовы sleep, если changeContext истинно, а затем сразу же завершает цикл (break не находится внутри if-блока anymo число рейнольдса Так что если вы хотите последовательное поведение написать это:

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

Btw, Apple была проблема безопасности в прошлом году, который в основном был подобный источник (двойная break и нет фигурных скобок).

+0

Он работает, когда я добавляю Thread.sleep после while (true) {Thread.sleep (1); if (....)} –