A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘海源 中级黑马   /  2012-7-22 22:11  /  1181 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.huawei.interview;

public class MultiThread {

     /**

      * @param args

      */

     public static void main(String[] args) {

          // TODO Auto-generated method stub

          new Thread(new Thread1()).start();

          try {

              Thread.sleep(10);

          } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

          }

          new Thread(new Thread2()).start();         

     }

     private static class Thread1 implements Runnable

     {

          @Override

          public void run() {

              // TODO Auto-generated method stub

//由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。

              synchronized (MultiThread.class) {

                   System.out.println("enter thread1...");

                   System.out.println("thread1 is waiting");

                   try {

              //释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。

                        MultiThread.class.wait();

                   } catch (InterruptedException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                   }

                   System.out.println("thread1 is going on...");

                   System.out.println("thread1 is being over!");            

              }

          }

     }

     private static class Thread2 implements Runnable

     {

          @Override

          public void run() {

              // TODO Auto-generated method stub

              synchronized (MultiThread.class) {

                   System.out.println("enter thread2...");

                   System.out.println("thread2 notify other thread can release wait status..");

//由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了10毫秒,但thread1仍然不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。

                   MultiThread.class.notify();

                  

                   System.out.println("thread2 is sleeping ten millisecond...");

                   try {

                        Thread.sleep(10);

                   } catch (InterruptedException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                   }

                   System.out.println("thread2 is going on...");

                   System.out.println("thread2 is being over!");

              }

          }

     }   

}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马