gpt4 book ai didi

java - Java 线程的意外行为

转载 作者:行者123 更新时间:2023-11-30 09:33:26 24 4
gpt4 key购买 nike

我在回答 this question 时遇到了这个有趣的情况.

试试这段设计糟糕的代码——

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class abc extends JFrame implements ActionListener
{

boolean button_clicked = false;
JButton b1;

abc(){
this.setSize (400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.createUI();
}

void createUI(){
this.setLayout(null);
b1 = new JButton("Click here");
b1.setSize(110,30);
b1.setLocation(10,210);
this.add(b1);
b1.addActionListener(this);
}

public boolean isButton_clicked()
{
return button_clicked;
}

public void setButton_clicked(boolean button_clicked) {
this.button_clicked = button_clicked;
}



public void actionPerformed(ActionEvent arg0) {
button_clicked = true;
}

}

这是主要方法。

class tempMain extends JFrame
{

public static void main(String[] args) throws Exception
{
abc temp = new abc();
temp.setVisible(true);
while(true)
{
// Thread.sleep(200);
if(temp.isButton_clicked())
{
JOptionPane.showMessageDialog(null, "Hello");
temp.setButton_clicked(false);
}
}
}
}

当我在我的 Windows 7 机器上运行它时,在我单击按钮后至少大约一分钟内没有任何反应(在那之后我没有等待)。

现在,只需做一个小改动 -

  Thread.sleep(200); // uncomment this from the main.

令人惊讶的是,它可以工作并显示一条 JOptionPane 消息。为什么第一次没有显示消息?

最佳答案

And surprisingly, it works and a JOptionPane message is displayed. Why is the message not displayed the first time?

button_clicked 未标记为 volatile 并且正在从与主线程不同的线程进行更新。由于回调是从事件处理程序线程进行的,主线程不会看到更新,除非 button_clicked 被定义为 volatile boolean。进入休眠状态可能会跨越内存屏障,幸运的是 button_clicked 会在主线程中更新。

还有一些reading about volatile以及为什么在我们处理多线程时它很重要。


另一个问题是您有一个无限循环,它会向 System.out 发送消息。这会在一段时间后完全阻塞,因为控制台无法快速显示行,从而停止检查点击。

关于java - Java 线程的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com