死循环里的代码不执行,但是在死循环里加个输出就执行,并且线程也没有退出
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 的数值有没有改变