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,而循环应使第二部分也工作。