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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangyinhui 中级黑马   /  2013-4-5 21:02  /  1146 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangyinhui 于 2013-4-6 18:20 编辑
  1. import java.util.concurrent.locks.*;

  2. class Demo4_Notify {

  3.         public static void main(String[] args) {
  4.                 final Printer p = new Printer();

  5.                 new Thread() {
  6.                         public void run() {
  7.                                 while (true)
  8.                                         // 一直执行
  9.                                         try {
  10.                                                 p.print1();
  11.                                         } catch (Exception e) {
  12.                                                 e.printStackTrace();
  13.                                         }
  14.                         }
  15.                 }.start();

  16.                 new Thread() {
  17.                         public void run() {
  18.                                 for (int i = 0; i < 5; i++)
  19.                                         // 指定执行的次数
  20.                                         try {
  21.                                                 p.print2();
  22.                                         } catch (Exception e) {
  23.                                                 e.printStackTrace();
  24.                                         }
  25.                         }
  26.                 }.start();

  27.         }

  28. }

  29. class Printer {
  30.         private int flag = 1;
  31.         private ReentrantLock lock = new ReentrantLock();
  32.         private Condition c1 = lock.newCondition();
  33.         private Condition c2 = lock.newCondition();

  34.         public void print1() throws Exception {
  35.                 lock.lock();
  36.                 if (flag != 1)
  37.                         c1.await();
  38.                 System.out.print("你好");
  39.                 System.out.print("\r\n");
  40.                 flag = 2;
  41.                 c2.signal();
  42.                 lock.unlock();
  43.         }

  44.         public void print2() throws Exception {
  45.                 lock.lock();
  46.                 if (flag != 2)
  47.                         c2.await();
  48.                 System.out.print("大家好");
  49.                 System.out.print("\r\n");
  50.                 flag = 1;
  51.                 c1.signal();
  52.                 lock.unlock();
  53.         }

  54. }
复制代码
这段代码我让一个线程为while (true)一个为for (int i = 0; i < 5; i++)程序执行后结果为但是程序却没有停止也不输出了,为什么啊?为什么不是输出5个大家好后一直输出你好啊?
你好
大家好
你好
大家好
你好
大家好
你好
大家好
你好
大家好
你好

1 个回复

倒序浏览
  public void print1() throws Exception {
                lock.lock();
                if (flag != 1)
                        c1.await();
                System.out.print("你好");
                System.out.print("\r\n");
                flag = 2;
                c2.signal();
                lock.unlock();
        }

        public void print2() throws Exception {
                lock.lock();
                if (flag != 2)
                        c2.await();
                System.out.print("大家好");
                System.out.print("\r\n");
                flag = 1;
                c1.signal();
                lock.unlock();
        }

当五次for循环执行完后就是执行while(true)中的语句
lock.lock();
                if (flag != 1)
                        c1.await();
                System.out.print("你好");
                System.out.print("\r\n");
                flag = 2;
                c2.signal();
                lock.unlock();

这时   flag = 2;而输出 “你好” 需要   flag = 1;所以“你好”就不能再输出了,既是线程1就不能执行,会进入等待状态。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马