Java 实现操作侦听器接口

Java 实现操作侦听器接口,java,swing,Java,Swing,当m更改时,第一个代码打印字符串m, 但是当我删除第一个if语句时,如第二个代码中所示,当它发生变化时,我无法打印m。 程序代码如下所示 代码1 import javax.swing.*; import java.awt.*; import java.awt.event.*; class firstgui extends JFrame implements ActionListener{ private JTextArea textarea; priv

m
更改时,第一个代码打印字符串
m
, 但是当我删除第一个if语句时,如第二个代码中所示,当它发生变化时,我无法打印m。 程序代码如下所示

代码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);
    }       
  }
 }

应用程序涉及不同的线程,一个是
事件调度线程
,另一个是
主线程

actionPerformed在
事件调度线程中执行

主线程中执行
时忙循环

一个线程所做的更改对另一个线程不可见。您需要使用
volatile
关键字来保证其他线程可以看到变量更新

类似于静态易失性字符串m=“bye”

建议使用
wait/notify
进行线程通信

编辑:

第一个代码部分工作的原因是因为println被执行了

if(m.equals("bye"))
{
    System.out.println(m);
}
由于println在
这个
对象上同步,它在主线程的关系之前触发。因此,读取m的最新值

你可以多登记

Synchronized
volatile
在关系发生之前构造表单
只有在写操作发生在读操作之前,一个线程的写操作的结果才能保证对另一个线程的读操作可见

你真的有问题吗?你应该让你的问题的读者清楚你的代码的实际结果是什么,预期结果是什么。这个易变的东西实际上工作得很好,谢谢ravthiru,但是在我发布的第一个代码中,它没有使用关键字“volatile”,可以帮助我理解为什么会这样!请参阅答案中的编辑,只需在内部打印LN,而循环应使第二部分也工作。