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

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 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名