当前位置: 技术问答>java相关
线程的问题:对象的notifyAll通知不到等待的线程,为什么?
来源: 互联网 发布时间:2017-04-26
本文导语: 如下代码: public class ThreadA extends Thread { public void run(){ synchronized(Main.a){ try{ System.out.println("1"); Main.a.wait(); } catch(Exception e){ } System.o...
如下代码:
public class ThreadA extends Thread {
public void run(){
synchronized(Main.a){
try{
System.out.println("1");
Main.a.wait();
}
catch(Exception e){
}
System.out.println("In 1");//程序怎么也运行不到这里,为什么?
}
}
}
public class Main {
public static String a="Test";
public static void main(String[] args) {
ThreadA a=new ThreadA();
a.start();
try{//让a这个线程运行起来
Thread.sleep(1000);
}
catch(Exception e){
}
synchronized(a){
a.notifyAll();//照理这里通知了,那个线程应该会得到,可是没有得到通知
}
try{//让主线程不马上退出
Thread.sleep(100000);
}
catch(Exception e){
}
}
}
这行ThreadA中的代码:System.out.println("In 1");无论如何也运行不到这里,为什么?
public class ThreadA extends Thread {
public void run(){
synchronized(Main.a){
try{
System.out.println("1");
Main.a.wait();
}
catch(Exception e){
}
System.out.println("In 1");//程序怎么也运行不到这里,为什么?
}
}
}
public class Main {
public static String a="Test";
public static void main(String[] args) {
ThreadA a=new ThreadA();
a.start();
try{//让a这个线程运行起来
Thread.sleep(1000);
}
catch(Exception e){
}
synchronized(a){
a.notifyAll();//照理这里通知了,那个线程应该会得到,可是没有得到通知
}
try{//让主线程不马上退出
Thread.sleep(100000);
}
catch(Exception e){
}
}
}
这行ThreadA中的代码:System.out.println("In 1");无论如何也运行不到这里,为什么?
|
这是一个变量名覆盖的问题
"synchronized(a)"中的a应该指的是"public static String a="Test";"吧?
但是你把线程对象也定义为 a 了,所以在main函数中"synchronized(a)"以及之后的"a.notifyAll()"中的 a 都指的"ThreadA a=new ThreadA();"线程 a 了,所以,会出现没有将"String a"等待队列中的线程释放的结果
解决:
只要将线程变量改名即可,如改为:
ThreadA b = new ThreadA();
~~~
b.start();
~~
最后程序如下:(线程类 class ThreadA 不用改,只改main方法即可)
public class Main {
public static String a = "Test";
public static void main( String[] args ) {
ThreadA b = new ThreadA();
//注意: ~~~~
b.start();
//~~~~
//其他地方不变
try{//让a这个线程运行起来
Thread.sleep(1000);
}
catch( Exception e ){}
synchronized(a){
a.notifyAll();
}
try{//让主线程不马上退出
Thread.sleep(10000);
}
catch(Exception e){}
}
}
"synchronized(a)"中的a应该指的是"public static String a="Test";"吧?
但是你把线程对象也定义为 a 了,所以在main函数中"synchronized(a)"以及之后的"a.notifyAll()"中的 a 都指的"ThreadA a=new ThreadA();"线程 a 了,所以,会出现没有将"String a"等待队列中的线程释放的结果
解决:
只要将线程变量改名即可,如改为:
ThreadA b = new ThreadA();
~~~
b.start();
~~
最后程序如下:(线程类 class ThreadA 不用改,只改main方法即可)
public class Main {
public static String a = "Test";
public static void main( String[] args ) {
ThreadA b = new ThreadA();
//注意: ~~~~
b.start();
//~~~~
//其他地方不变
try{//让a这个线程运行起来
Thread.sleep(1000);
}
catch( Exception e ){}
synchronized(a){
a.notifyAll();
}
try{//让主线程不马上退出
Thread.sleep(10000);
}
catch(Exception e){}
}
}