2016-09-14 2 views
-1

первый код печатает строку m, когда m изменений, , но когда я удаляю первый оператор if, как показано во втором коде, я не могу напечатать m, когда он изменится. коды программы приведены ниже., реализующий интерфейс Action Listener

код 1

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
    class firstgui extends JFrame implements ActionListener{ 
     private JTextArea textarea; 
     private JTextField textfield; 

     static String m="bye"; 

firstgui() { 
    setLayout(new FlowLayout()); 
    textfield = new JTextField(20); 
    add(textfield); 
    textarea = new JTextArea(5,20); 
    add(textarea); 
    textfield.addActionListener(this);   
} 
public void actionPerformed(ActionEvent e) 
{ 
    String text= textfield.getText(); 
    m=text; 
    textarea.append("aman: " + text + "\n"); 
    textfield.setText(""); 
} 

public static void main(String args[]) 
{ int t=0; 
    firstgui a = new firstgui(); 
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    a.setVisible(true); 
    a.setTitle("gui"); 
    a.pack(); 
    while(true) 
    { 
     if(m.equals("bye")) 
     { 
      System.out.println(m); 
     } 
     if(!(m.equals("bye"))) 
      System.out.println(m); 
    }  
    } 
} 

код 2

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
     class firstgui extends JFrame implements ActionListener{ 
    private JTextArea textarea; 
    private JTextField textfield; 

    static String m="bye"; 

    firstgui() { 
    setLayout(new FlowLayout()); 
    textfield = new JTextField(20); 
    add(textfield); 
    textarea = new JTextArea(5,20); 
    add(textarea); 
    textfield.addActionListener(this);   
} 

public void actionPerformed(ActionEvent e) 
{ 
    String text= textfield.getText(); 
    m=text; 
    textarea.append("aman: " + text + "\n"); 
    textfield.setText(""); 
} 

    public static void main(String args[]) 
{ int t=0; 
    firstgui a = new firstgui(); 
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    a.setVisible(true); 
    a.setTitle("gui"); 
    a.pack(); 
    while(true) 
    {    
     if(!(m.equals("bye"))) 
     System.out.println(m); 
    }  
    } 
} 
+1

У вас действительно есть вопрос? –

+0

Вы должны рассказать читателю о своем вопросе, каков фактический результат вашего кода и каков ожидаемый результат. – gus27

ответ

0

Существуют различные темы, связанные с вашим приложением один является event dispatching thread другой main thread.

actionPerformed выполнен в event dispatching thread

занят-обхвата while выполнен в main thread

изменения, сделанные одним потоком, не видны другому потоку. вам нужно использовать ключевое слово volatile, чтобы переменные обновления гарантированно видели другие темы.

некоторые вещи, как static volatile String m = "bye";

Рекомендуется использовать wait/notify для нарезания связи

EDIT:

Причина первая часть кода работает, потому что Println был выполнен.

if(m.equals("bye")) 
{ 
    System.out.println(m); 
} 

В Println является syncronised на this объекта, это вызвало случается, прежде чем соотношение для основного потока. из-за которого считывается последнее значение m.

Вы можете проверить более Java Doc

Synchronized и volatile конструктов формы происходит, прежде чем отношения Результатов записи по одной нити гарантированно будут видны для чтения другого потока, только если операция happens- записи перед операцией чтения.

+0

, что изменчивая вещь действительно работала так спасибо ravthiru, но в первом коде, который я опубликовал, он работал без использования ключевого слова volatile, может помочь мне понять, почему это так! –

+0

См. Редактирование в ответе, просто напечатайте внутри внутри цикла, чтобы вторая часть работала. – ravthiru

Смежные вопросы