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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

蓝色的闪电

注册黑马

  • 黑马币:

  • 帖子:

  • 精华:

本帖最后由 蓝色的闪电 于 2012-1-28 13:52 编辑

这个是我根据教程自己改写的一个程序,我想让这个程序自动停止,但试了很多方法都没实现,哪位高手看看是什么原因???谢谢!!!!


  1. import java.util.concurrent.locks.*;

  2. class Produce{
  3.         int num = 50;
  4.         private String name;
  5.         private int count = 0;
  6.         boolean flag = false;
  7.         private final Lock lock = new ReentrantLock();
  8.         final Condition pro = lock.newCondition();
  9.         final Condition con = lock.newCondition();
  10.         public String getName() {
  11.                 return name;
  12.         }
  13.         public void setName(String name) {
  14.                 this.name = name;
  15.         }
  16.         public int getCount() {
  17.                 return count;
  18.         }
  19.         public void setCount(int count) {
  20.                 this.count = count;
  21.         }
  22.         public void putIn() throws InterruptedException{
  23.                 while(getCount()<num){
  24.                         lock.lock();
  25.                         try {
  26.                                 Thread.sleep(50);
  27.                         }
  28.                         catch (InterruptedException e1) {
  29.                                 // TODO Auto-generated catch block
  30.                                 e1.printStackTrace();
  31.                         }
  32.                         try{
  33.                                 while(flag){
  34.                                         pro.await();
  35.                                 }
  36.                                 if(getCount()<num){
  37.                                         this.setName("生产者");
  38.                                         count++;
  39.                                         System.out.println(Thread.currentThread().getName()+"---"+name+"---"+count);
  40.                                         flag = true;
  41.                                         con.signal();
  42.                                 }
  43.                         }
  44.                         finally{
  45.                                 lock.unlock();
  46.                         }
  47.                 }
  48.         }
  49.         public void putOut() throws InterruptedException{
  50.                 while(getCount()<=num){
  51.                         lock.lock();
  52.                         try {
  53.                                 Thread.sleep(50);
  54.                         }
  55.                         catch (InterruptedException e1) {
  56.                                 // TODO Auto-generated catch block
  57.                                 e1.printStackTrace();
  58.                         }
  59.                         try{
  60.                                 while(!flag){
  61.                                         con.await();
  62.                                 }
  63.                                 if(getCount()<num){
  64.                                         this.setName("消费者");
  65.                                         System.out.println(Thread.currentThread().getName()+"----"+name+"----"+count);
  66.                                         //count++;
  67.                                         flag = false;
  68.                                         pro.signal();
  69.                                 }
  70.                                 //在这里我改变了条件,为什么还是不能自动停止呢???
  71.                                 else if(getCount()==num){
  72.                                         this.setName("消费者");
  73.                                         System.out.println(Thread.currentThread().getName()+"----"+name+"----"+count);
  74.                                         count++;
  75.                                 }
  76.                         }
  77.                         finally{
  78.                                 lock.unlock();
  79.                         }
  80.                 }
  81.         }
  82. }

  83. class Producer implements Runnable{
  84.         private Produce p;
  85.         Producer(Produce p){
  86.                 this.p = p;
  87.         }
  88.         public void run(){
  89.                 try {
  90.                         p.putIn();
  91.                 } catch (InterruptedException e) {
  92.                         // TODO Auto-generated catch block
  93.                         e.printStackTrace();
  94.                 }
  95.         }
  96. }

  97. class Consumer implements Runnable{
  98.         private Produce p;
  99.         Consumer(Produce p){
  100.                 this.p = p;
  101.         }
  102.         public void run(){
  103.                 try {
  104.                         p.putOut();
  105.                 } catch (InterruptedException e) {
  106.                         // TODO Auto-generated catch block
  107.                         e.printStackTrace();
  108.                 }
  109.         }
  110. }

  111. public class LockTest {

  112.         /**
  113.          * @param args
  114.          */
  115.         public static void main(String[] args) {
  116.                 // TODO Auto-generated method stub
  117.                 Produce p = new Produce();
  118.                 new Thread(new Producer(p)).start();
  119.                 new Thread(new Producer(p)).start();
  120.                 new Thread(new Consumer(p)).start();
  121.                 new Thread(new Consumer(p)).start();
  122.         }

  123. }
复制代码

1 个回复

倒序浏览


import java.util.concurrent.locks.*;

class Produce{
        int num = 50;
        private String name;
        private int count = 0;
        boolean flag = false;
        private final Lock lock = new ReentrantLock();
        final Condition pro = lock.newCondition();
        final Condition con = lock.newCondition();
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getCount() {
                return count;
        }
        public void setCount(int count) {
                this.count = count;
        }
        public void putIn() throws InterruptedException{
                while(getCount()<num){
                        lock.lock();
                        try {
                                Thread.sleep(50);
                        }
                        catch (InterruptedException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                        }
                        try{
                                while(flag){
                                        pro.await();
                                }
                                if(getCount()<num){
                                        this.setName("生产者");
                                        count++;
                                        System.out.println(Thread.currentThread().getName()+"---"+name+"---"+count);
                                        flag = true;
                                        con.signal();
                                }
                        }
                        finally{
                                lock.unlock();
                        }
                }
        }
        public void putOut() throws InterruptedException{
                while(getCount()<=num){
                        lock.lock();
                        try {
                                Thread.sleep(50);
                        }
                        catch (InterruptedException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                        }
                        try{
                                while(!flag){
                                        con.await();
                                }
                                if(getCount()<num){
                                        this.setName("消费者");
                                        System.out.println(Thread.currentThread().getName()+"----"+name+"----"+count);
                                        //count++;
                                        flag = false;
                                        pro.signal();
                                }
                                //在这里我改变了条件,为什么还是不能自动停止呢???
                                else if(getCount()==num){
                                        this.setName("消费者");
                                        System.out.println(Thread.currentThread().getName()+"----"+name+"----"+count);
                                        count++;
                                }
                        }
                        finally{
                                lock.unlock();
                        }
                }
        }
}

class Producer implements Runnable{
        private Produce p;
        Producer(Produce p){
                this.p = p;
        }
        public void run(){
                try {
                        p.putIn();
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}

class Consumer implements Runnable{
        private Produce p;
        Consumer(Produce p){
                this.p = p;
        }
        public void run(){
                try {
                        p.putOut();
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}

public class LockTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Produce p = new Produce();
                new Thread(new Producer(p)).start();
                new Thread(new Producer(p)).start();
                new Thread(new Consumer(p)).start();
                new Thread(new Consumer(p)).start();
        }

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