HackShendi 2020-01-14 20:06 采纳率: 100%
浏览 698
已采纳

Java的死循环里的代码不执行

死循环里的代码不执行,但是在死循环里加个输出就执行,并且线程也没有退出

package shendi.utils;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
/**
 * -问题 代码原封不动运行,two函数里的死循环感觉像是挂了一样 但是线程没有结束 不执行
 * -但是在循环内加个输出,函数就没有问题,Why?
 */
public class Test extends JFrame implements Runnable {
    private String type;
    private static int i = 0;

    public Test() {
        JButton button = new JButton("i+1");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                i++;
                System.out.println("two函数的死循环就是不会被执行 + i现在是:"+i);
            }
        });
        this.add(button);
        this.setBounds(10, 10,100,100);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);

        new Thread(new Test("1")).start();
        new Thread(new Test("2")).start();
    }
    public Test(String type) {this.type = type;}

    public static void main(String[] args) {
        new Test();
    }
    private void one() {
        while (true) {
//          System.out.println(i);
        }
    }
    private void two() {
        System.out.println("two被调用了,线程 ");
        while (true) {
            if (1 == 2) break;
//          if (i == 0) System.out.println("i=0 two函数");
            if (i > 1) System.out.println("我是活的");
        }
        System.out.println("two挂了");
    }
    public void run() {
        switch (type) {
        case "1":
            one();
            break;
        case "2":
            two();
            break;
        }
    }
}

  • 写回答

5条回答

  • HackShendi 2023-07-25 16:35
    关注

    好久没看,今天来完结下,是可见性与资源争夺的问题,使用 Thread.sleep 放弃争夺,切换线程,当线程切回来的时候刷新了缓存解决了可见性问题,或者加上 synchronized 解决可见性问题,当然也可以直接给变量加上 volatile 关键词,而上面说的加 System.out.println 没问题是因为这个函数内使用了 synchronized (this) 这样。

    总之,一个变量需要在多个线程中使用的话,那么加上 volatile 就可以了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已采纳回答 7月25日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器