问题描述
- java线程没有响应,像是暂停了一样
-
简单地来说,就是有两个线程A和B,在main函数里面先后启动他们
线程A的run函数里面有一个while循环,循环体里主要是一句if,判断的是一个存在于A里面的一个布尔变量boo,如果是true就输出一句话,但boo在初始化的时候就已经设置为false
线程B在接收了一次输入之后,再把线程A里面的boo改成true,仅此而已。
现在问题来了,线程A始终没有输出,相当于线程A暂停了(线程A并没有被杀死),求解呀...
更加奇怪的是,如果使用debug模式,程序是可以正常运行的,这又是为什么呢?
代码如下:public class ThreadA extends Thread{ public boolean boo; public ThreadA() { boo = false; } public void run() { while (true) { if (boo) { System.out.println("boo equals ture now!"); boo = false; } } } } public class ThreadB extends Thread{ private ThreadA a; public ThreadB(ThreadA a) { this.a = a; } public void run() { try { int num = System.in.read(); } catch (IOException e) { e.printStackTrace(); } a.boo = true; } } public class MainFunc { public static void main(String[] args) { ThreadA a = new ThreadA(); ThreadB b = new ThreadB(a); a.start(); b.start(); } }
解决方案
这是基本的java程序错误,请把boo改成volatile。:-D.
至于为什么,请参考jls
解决方案二:
A线程启动一直在判断foo, B线程启动后被IO阻塞等待输入,输入完后,boo为true, B线结束了。A线程判断foo为true输出一句并将foo设为false。A线程中foo一直为false, 线程死循环判断foo
解决方案三:
public class ThreadB extends Thread{
private ThreadA a;
public ThreadB(ThreadA a) {
this.a = a;
}
public void run() {
while(true){
try {
int num = System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
a.boo = true;
}
}
}
解决方案四:
boo的值set进去就好了
时间: 2024-08-02 00:59:57