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;
        }
    }
}

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

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

不是挂了,好像和线程安全有关,等个懂多线程的

你怎么知道他挂了呢,而且一段代码写成死循环,这是不可以的

two方法一直在调用的呀,但是你的两个判断都不对呀,都是false(初始1=0,构造器i++,变成了1,在之后就没变过,所以i不会大于1,),所以不会打印,你如果在two方法里面加上i++;就能看到效果,而不是一直死循环还不输出

在two方法中输出 i 看看 i 的数值有没有改变