黑马程序员技术交流社区

标题: 线程通信、、为什么只能打印三条数据?? [打印本页]

作者: gzbbxu    时间: 2013-6-26 17:06
标题: 线程通信、、为什么只能打印三条数据??
本帖最后由 孙百鑫 于 2013-6-30 08:19 编辑

public class Test4 {
        public static void main(String[] args) {
                Resource r = new Resource();
                Producer pro = new Producer(r);
                Cousumer con = new Cousumer(r);
                Thread t1 = new Thread(pro);
                Thread t2 = new Thread(con);
                t1.start();
                t2.start();
        }
}

class Resource {
        private String name;
        private int count = 1;// 编号
        private boolean flag = false;

        public synchronized void set(String name) {
                if (flag) {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                this.name = name + "--" + count++;
                System.out.println(Thread.currentThread().getName() + "..生产者"
                                + this.name);
                flag = true;
                this.notify();
        }

        public synchronized void out() {
                if (!flag) {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                System.out.println(Thread.currentThread().getName() + "..消费者"
                                + this.name);
                flag = false;
                this.notify();
        }
}

class Producer implements Runnable {
        private Resource res;

        public Producer(Resource res) {
                this.res = res;
        }

        public void run() {
                // TODO Auto-generated method stub
                while (true) {
                        res.set("+商品+");
                }
        }
}

class Cousumer implements Runnable {// 消费者
        private Resource res;

        public Cousumer(Resource res) {
                this.res = res;
        }

        public void run() {
                // TODO Auto-generated method stub
                res.out();
        }

}

作者: gzbbxu    时间: 2013-6-26 17:06
  1. public class Test4 {
  2.         public static void main(String[] args) {
  3.                 Resource r = new Resource();
  4.                 Producer pro = new Producer(r);
  5.                 Cousumer con = new Cousumer(r);
  6.                 Thread t1 = new Thread(pro);
  7.                 Thread t2 = new Thread(con);
  8.                 t1.start();
  9.                 t2.start();
  10.         }
  11. }

  12. class Resource {
  13.         private String name;
  14.         private int count = 1;// 编号
  15.         private boolean flag = false;

  16.         public synchronized void set(String name) {
  17.                 if (flag) {
  18.                         try {
  19.                                 this.wait();
  20.                         } catch (InterruptedException e) {
  21.                                 // TODO Auto-generated catch block
  22.                                 e.printStackTrace();
  23.                         }
  24.                 }
  25.                 this.name = name + "--" + count++;
  26.                 System.out.println(Thread.currentThread().getName() + "..生产者"
  27.                                 + this.name);
  28.                 flag = true;
  29.                 this.notify();
  30.         }

  31.         public synchronized void out() {
  32.                 if (!flag) {
  33.                         try {
  34.                                 this.wait();
  35.                         } catch (InterruptedException e) {
  36.                                 // TODO Auto-generated catch block
  37.                                 e.printStackTrace();
  38.                         }
  39.                 }
  40.                 System.out.println(Thread.currentThread().getName() + "..消费者"
  41.                                 + this.name);
  42.                 flag = false;
  43.                 this.notify();
  44.         }
  45. }

  46. class Producer implements Runnable {
  47.         private Resource res;

  48.         public Producer(Resource res) {
  49.                 this.res = res;
  50.         }

  51.         public void run() {
  52.                 // TODO Auto-generated method stub
  53.                 while (true) {
  54.                         res.set("+商品+");
  55.                 }
  56.         }
  57. }

  58. class Cousumer implements Runnable {// 消费者
  59.         private Resource res;

  60.         public Cousumer(Resource res) {
  61.                 this.res = res;
  62.         }

  63.         public void run() {
  64.                 // TODO Auto-generated method stub
  65.                 res.out();
  66.         }

  67. }
复制代码

作者: 薛淑凯    时间: 2013-6-26 18:50
搞了半天,郁闷了为什么叫不醒消费者呢,查看了这俩线程的状态之后才发现,消费者这个线程执行一次后就结束了,退出了。仔细一瞅,Cousumer中的run方法没有加判断,,,晕啊
作者: 孙百鑫    时间: 2013-6-30 08:18
楼主您好,帖子长时间没有动态我已经将您的帖子改成已解决。如有问题请私密我哦~




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