Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 时钟线程-奇怪的bug system.out.println_Java_Multithreading_Swing_Listeners - Fatal编程技术网

Java 时钟线程-奇怪的bug system.out.println

Java 时钟线程-奇怪的bug system.out.println,java,multithreading,swing,listeners,Java,Multithreading,Swing,Listeners,我有我的线 this.clock = new JLabel(); clockThread = new Thread(new Runnable() { public void run() { clockRun(); } }); clockThread.start(); this.clock.addMouseListener(new MouseAdapter() { @Override public void

我有我的线

this.clock = new JLabel();
clockThread = new Thread(new Runnable() {
      public void run() {
            clockRun();
        }
    });
clockThread.start();
this.clock.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (clockDisplayRealTime) {
                clockDisplayRealTime = false;
            } else {
                clockDisplayRealTime = true;
            }
        }

    });
除非我有下面的System.out.println,否则这将不起作用 我在挠头,想知道出了什么问题。请帮帮我。谢谢

public void clockRun() {
        while (true) {
            System.out.println(clockDisplayRealTime);
            if (clockDisplayRealTime) {
                Date date = new Date();
                clockRealtime = date.getTime();
                this.clock.setText(sdf.format(clockRealtime));
            }
        }
    }
需要易变的

volatile private boolean clockDisplayRealTime = false;

这个问题重复了

Swing组件只应在上进行变异

解决你的问题最简单的方法可能是一个简单的方法。您也可以按如下方式手动操作:

clockThread = new Thread(() -> {
    while (true) {
        if (clockDisplayRealTime) {
            SwingUtilities.invokeAndWait(() -> {
                Date date = new Date();
                clockRealtime = date.getTime();
                this.clock.setText(sdf.format(clockRealtime));
            });
            Thread.sleep(1000); // no need to update the UI more often than that
        }
    }
});    

代码失败的原因是多个线程访问同一字段时没有同步,在这种情况下,Java内存模型不能保证一个线程所做的更改对另一个线程可见。通过将访问clockDisplayRealTime字段的所有代码放在同一个线程中,您可以巧妙地避开这个问题。

可能是更新太快了?是的!同意@cricket\u 007-将日志语句添加到
mouseClicked()
中,以及使用什么初始化
clockDisplayRealTime
?我还想在
clockRun()
中添加
Thread.sleep(200)
,否则,为了显示一些文本,您需要对CPU进行大量的修改。由于Swing不是线程安全的,所以最好使用Swing
计时器或
SwingWorker
而不是普通的
线程,这样你就可以更好地控制开关。你可能想读一读,按照建议,<代码> PrimTrn()<代码>可以偷偷摸摸地同步你的错误代码。你可以考虑使用<代码> AtomicBoolean <代码>,我不知道,我认为Swing <代码>定时器< /代码>会更容易,您可以使用
定时器
启动
停止
SwingUtilities.invokeAndWait(()->{必须测试EDT,从isEventDIspatchThread返回时必须有false…,否则RepainManager返回异常