少年阿宾

那些青春的岁月

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
  1. 看到一个题目:针对下面的程序,写出magic方法 让整个程序只打印出step1,step2 不打印step3  

    public static void enter(Object obj) {
        System.out.println("Step 1");
        try {
   magic1(obj);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
        System.out.println("Step 2");
        synchronized (obj) {
            System.out.println("Step 3 (never reached here)"); 
        }
    }

 题目的意思很容易理解,可是要做出这道题目需要对多线程的基本改进非常的理解。

下面列出基本思路:

 

 

主线程想获取obj的锁,但是获取不到,说明子线程始终在占据着这个对象的锁。

同时主线程又能返回。

那现在就要实现让子线程先跑,然后再唤醒主线程。这个显然是锁的占有和唤醒,那么问题来了,将什么做为这个锁呢?如果是obj的话,不可能,因为子线程显然不能在放掉obj.

那么只能是子线程自己的锁。

 

下边是程序

    static void magic1(final Object obj) throws Exception{
     final Thread t = new Thread(){
      public void run(){
       synchronized(this){
        synchronized(obj){
         try {
          notify();
       join();
      } catch (InterruptedException e) {
      }
        }
        
       }
       
      }
     };
     synchronized(t){
      t.start();
      t.wait();
     }
    }




posted on 2012-11-09 21:37 abin 阅读(343) 评论(0)  编辑  收藏 所属分类: JavaMultithread

只有注册用户登录后才能发表评论。


网站导航: