yipinhanxin 2010-07-26 16:54
浏览 137
已采纳

java多线程基础

[code="java"]
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()注释掉,
没有唤醒主线程,主线程为什么还能继续进行?*/
[/code]

  • 写回答

2条回答 默认 最新

  • iteye_7333 2010-07-26 20:48
    关注

    不能解释具体原因,只能猜测 用线程对象wait()的时候,线程对象运行完成后(run()完成退出),所以利用这个线程对象的wait()都退出等待。

    写了一个例子:
    [code="java"]public class ThreadAa {
    public static void main(String args[]){

    ThreadB1 t1 = new ThreadB1();
    ThreadB2 t2 = new ThreadB2();
    ThreadB3 t3 = new ThreadB3();

        t2.oo = t1;
        t3.oo = t1;
    
        t1.start();
        t2.start();
        t3.start();
    }
    

    }
    class ThreadB1 extends Thread {
    public Object oo ;
    public void run() {
    try{Thread.sleep(1000);}catch(Exception e) {};
    // while(true) {
    // try{Thread.sleep(10);}catch(Exception e) {};
    // }
    }
    }
    class ThreadB2 extends Thread {
    public Object oo ;

    public void run() {
        synchronized(oo) {
            System.out.println("wait2");
            try{oo.wait();} catch(Exception e) {
                System.out.println("interrupt2");
            }
        }
        System.out.println("end2");
    }
    

    }
    class ThreadB3 extends Thread {
    public Object oo ;

    public void run() {
        synchronized(oo) {
            System.out.println("wait3");
            try{oo.wait();} catch(Exception e) {
                System.out.println("interrupt3");
            }
        }
        System.out.println("end3");
    }
    

    } [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)