黑马程序员技术交流社区

标题: 线程问题,为什么运行一次就卡死那里 [打印本页]

作者: 秦岩    时间: 2012-4-8 23:28
标题: 线程问题,为什么运行一次就卡死那里
  1. /*
  2. * 为什么运行一次后就卡死。
  3. */

  4. package cn.copy;

  5. import java.util.concurrent.locks.Condition;
  6. import java.util.concurrent.locks.ReentrantLock;

  7. public class DateBaseDemo {

  8.         public static void main(String[] args) {
  9.                 DateBase db = new DateBase();
  10.                 new DBA(db).start();
  11.                 new Developer(db).start();
  12.         }

  13. }

  14. class DateBase {
  15.         String name;
  16.         String sex;
  17.         boolean Update;
  18.         ReentrantLock lock = new ReentrantLock();
  19.         Condition c1 = lock.newCondition();
  20.         Condition c2 = lock.newCondition();
  21. }

  22. class DBA extends Thread {
  23.         private DateBase db;
  24.         private int times;

  25.         public DBA(DateBase db) {
  26.                 this.db = db;
  27.         }

  28.         public void run() {
  29.                 while (true) {
  30.                         db.lock.lock();
  31.                         if (db.Update == true)
  32.                                 try {
  33.                                         db.c1.await();
  34.                                 } catch (InterruptedException e) {
  35.                                         // TODO Auto-generated catch block
  36.                                         e.printStackTrace();
  37.                                 }
  38.                         if (times++ % 2 == 0) {
  39.                                 db.name = "秦岩";
  40.                                 db.sex = "男";
  41.                         } else {
  42.                                 db.name = "晁喆";
  43.                                 db.sex = "女";
  44.                         }
  45.                         db.Update = true;
  46.                         db.c2.signal();
  47.                         db.lock.unlock();
  48.                 }
  49.         }
  50. }

  51. class Developer extends Thread {
  52.         private DateBase db;

  53.         public Developer(DateBase db) {
  54.                 this.db = db;
  55.         }

  56.         public void run() {
  57.                 db.lock.lock();
  58.                 if (db.Update == false)
  59.                         try {
  60.                                 db.c2.await();
  61.                         } catch (InterruptedException e) {
  62.                                 // TODO Auto-generated catch block
  63.                                 e.printStackTrace();
  64.                         }
  65.                 System.out.println(db.name + ", " + db.sex);
  66.                 db.Update = false;
  67.                 db.c1.signal();
  68.                 db.lock.unlock();
  69.         }
  70. }
复制代码
哪里错了吗? 我实在是找不到啊~~~  帮帮忙~~
作者: 申振华    时间: 2012-4-8 23:44
改为实现Runnable接口。
作者: 秦岩    时间: 2012-4-9 07:34
申振华 发表于 2012-4-8 23:44
改为实现Runnable接口。

为什么?
作者: 郑苑东    时间: 2012-4-9 07:51
class Developer extends Thread {
        private DateBase db;

        public Developer(DateBase db) {
                this.db = db;
        }

        public void run() {这里少了一个while循环,,
while(true){
                db.lock.lock();
                if (db.Update == false)
                        try {
                                db.c2.await();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                System.out.println(db.name + ", " + db.sex);
                db.Update = false;
                db.c1.signal();
          }      db.lock.unlock();
        }
}
作者: pray    时间: 2014-4-26 06:51
很好!!(此回复虽然仅有两个字,却深刻地表达了回复人的深深情感,可谓言简意赅,一字千金,字字扣人心弦!再加上以感叹号收尾,点睛之笔,妙笔生花,意境之深远,令人回味无穷!)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2