java吧 关注:1,255,245贴子:12,744,657
  • 18回复贴,共1

吧友们。这是怎么回事

只看楼主收藏回复

我想试一下在while循环里面使用wait结果我多次测试,永远只有一个消费者在运行。




IP属地:浙江1楼2020-12-05 23:27回复
    sync 啊


    来自iPhone客户端2楼2020-12-06 03:02
    回复
      第二个线程在锁外面 第一个线程在锁里面出不来


      来自iPhone客户端3楼2020-12-06 03:02
      收起回复
        class Factory{
        private int goods = 0;
        public synchronized void produce() {
        // System.out.println(Thread.currentThread() + ":first produce");
        while (true){
        if (goods < 1) {
        goods++;
        System.out.println("生产者:" + Thread.currentThread().getName() + "生产了1个商品,现在有" + goods + "个商品");
        try {
        Thread.sleep(200);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        notifyAll();
        } else {
        try {
        // System.out.println(Thread.currentThread() + ":wait");
        wait();
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        }
        }
        }
        public synchronized void consume() {
        // System.out.println(Thread.currentThread() + ":first consume");
        while (true){
        if (goods > 0) {
        goods--;
        System.out.println("消费者:" + Thread.currentThread().getName() + "消费了1个商品,现在有" + goods + "个商品");
        try {
        Thread.sleep(100);
        } catch (Exception e) {
        e.printStackTrace();
        }
        notifyAll();
        } else {
        try {
        System.out.println(Thread.currentThread() + ":wait");
        wait();
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        }
        }
        }
        }
        class Producer extends Thread{
        private Factory factory;
        public Producer(Factory factory){
        this.factory = factory;
        }
        @Override
        public void run() {
        System.out.println(this + "生产者" + getName() + "开始生产");
        // while (true) {
        factory.produce();
        // }
        }
        }
        class Consumer extends Thread{
        private Factory factory;
        public Consumer(Factory factory){
        this.factory = factory;
        }
        @Override
        public void run() {
        System.out.println(this + "消费者" + getName() + "开始消费");
        // while (true) {
        factory.consume();
        // }
        }
        }
        public class FactoryTest {
        public static void main(String[] args) {
        Factory factory = new Factory();
        Producer producer = new Producer(factory);
        producer.setName("1");
        Consumer consumer = new Consumer(factory);
        consumer.setName("2");
        Consumer consumer2 = new Consumer(factory);
        consumer2.setName("3");
        producer.start();
        consumer2.start();
        consumer.start();
        }
        }


        IP属地:浙江4楼2020-12-07 12:03
        收起回复


          5楼2020-12-07 13:36
          回复
            你生产者里判断goods < 1,岂不是生产者每生产一个就不会再生产了么, 只能等待消费者消费后唤醒才能生产下一个


            IP属地:中国香港6楼2020-12-07 14:04
            收起回复
              779518836(JAVA学习讨论裙)


              IP属地:浙江7楼2020-12-07 14:24
              回复
                这都不会你还好意思说自己的程序员?赶紧滚回工地搬砖吧


                8楼2020-12-09 18:56
                收起回复
                  锁的都是自己 sleep在这里没什么用 如果担心线程安全用个原子类。sync决定了同一时间只能有一个在消费和生产 至于是哪个就看谁启动快了。记住notify会继续执行剩下的部分 你的生产者也在wait。还有锁对象应该改成竞争对象 要不然以后会出现逻辑问题 千万别竞争一个用的却是另一个。耦合该强的时候一定要强。至于为什么在线程池中线程二干不过线程一 谁也不清楚 说不定哪里抽风了 或者底层实现的小细节。可能换换位置多试几次就又变了。


                  IP属地:四川来自iPhone客户端9楼2020-12-11 11:58
                  回复