解决方案 »


  1. public static void test3(){
            ThreadB b = new ThreadB();
             
            b.start();
             
            synchronized (o) {//主线程获取o上的锁
                try {
                    System.out.println("Waiting for b to complete...");
                    o.wait();//然后释放了
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("Total is: " + b.total);          
            }      
        }
    }
    class ThreadB extends Thread {
        int total = 0;
          
        public void run() {
            synchronized (WaitTest.o) {//导致ThreadB可以获取到锁
                System.out.println("ThreadB");
                for (int i = 0; i < 50; i++) {
                    total += i;
                    try {
                        Thread.sleep(100);
                        System.out.print(i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }                             
                }
                System.out.println();
                WaitTest.o.notify();//执行完毕,释放锁,唤醒等待线程,导致主线程继续执行
            }
        }  
    }
          
      


  2. Thread.sleep(long l)和object.wait(long l)
    共同点:  他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
    不同点:  
    1.Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
    2.object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作
    1楼说得对.
      

类似问题 »