第一个代码在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);
}
}
}
答案 0 :(得分:0)
您的应用程序涉及不同的线程,event dispatching thread
其他线程main thread
。
actionPerformed在event dispatching thread
繁忙循环while
在main thread
一个线程所做的更改对其他线程不可见。您需要使用volatile
关键字来保证其他线程可以看到变量更新。
像static volatile String m = "bye";
建议使用wait/notify
进行线程通信
编辑:
第一个代码部分工作的原因是因为println被执行了。
if(m.equals("bye"))
{
System.out.println(m);
}
由于println在this
对象上同步,它触发了主线程之前发生的关系。因为读取了m的最新值。
您可以在Java Doc
中查看更多内容 Synchronized
和volatile
构造形式发生在之前的关系之前
只有在读取操作之前发生写入操作时,一个线程的写入结果才能保证对另一个线程的读取可见。