class ThreadB extends Thread{
int total = 0;
public void run(){
synchronized(this){
System.out.println("ThreadB is running...");
for(int i=0;i<100;i++){
total += i;
}
System.out.println("total is "+total);
//notify();
}
}
}
public class ThreadA{
public static void main(String args[]){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
System.out.println("Waiting for b to complete...");
try{
Thread.sleep(3000);
b.wait();
}catch(InterruptedException e){}
System.out.println("Completed.Now back to main thread");
}
System.out.println("....Total is:"+b.total);
}
}
/*主线程先得到b的锁,执行到b.wait();的时候,主线程阻塞,释放对象锁,线程b变为运行状态,把notify()注释掉,
没有唤醒主线程,主线程为什么还能继续进行?
如果不start他就是一个普通的object如果不notify是不会解锁的
比如你要是这样
public class ThreadA{
public static void main(String args[]){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
System.out.println("Waiting for b to complete...");
try{
//Thread.sleep(3000);
b.wait();
}catch(InterruptedException e){}
System.out.println("Completed.Now back to main thread");
}
System.out.println("....Total is:"+b.total);
synchronized(b){
try {
b.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}最后那个锁就没解
还有啊为什么会不是先调用run中的函数啊,新手求解,谢谢!
而其他一般的object的子类在一个线程中wait之后如果要在这个线程唤醒则必须在那个获得锁的线程里notify
为什么不是先调用run中的函数,是因为主线程先得到了b指向的线程对象的锁,你可以试着在主线程里在b.start()之后和锁之间加上sleep(1000),则线程本身的run会先得到锁
class ThreadB extends Thread{
int total = 0;
static Object obj = new Object();
public void run(){
synchronized(obj){
System.out.println("ThreadB is running...");
for(int i=0;i<100;i++){
total += i;
}
System.out.println("total is "+total);
//obj.notify(); 换了一个普通类的对象锁
}
}
}
public class ThreadA{
public static void main(String args[]){
ThreadB b = new ThreadB();
b.start();
synchronized(ThreadB.obj){
System.out.println("Waiting for b to complete...");
try{
ThreadB.obj.wait();
}catch(InterruptedException e){
System.out.println("中断");
}
System.out.println("Completed.Now back to main thread");
}
System.out.println("....Total is:"+b.total);
}
}
//换了一个普通类的对象锁,如果不notify(),主线程就不能被唤醒?