小渣飞、 2020-11-12 22:16 采纳率: 87.9%
浏览 16

Java 多线程卡死,是两个线程锁对象不是同一个的原因吗?

public class Clerk {

    public static int productCount = 0;

    public static void main(String[] args) {
        Thread p1 = new Thread(new Producer(new Clerk()));
        p1.setName("生产者一号");
        Thread c1 = new Thread(new Customer(new Clerk()));
        c1.setName("消费者一号");

        p1.start();
        c1.start();

    }
}

/*
    生产者
 */
class Producer implements Runnable {
    private Clerk clerk;
    int count = Clerk.productCount;

    public Producer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public synchronized void run() {
        while (true) {
            if (count < 20) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count++;
                System.out.println(Thread.currentThread().getName() + ":生产了第" + count + "个商品");
                notify();
            } else {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

/*
    消费者
 */
class Customer implements Runnable {

    private Clerk clerk;
    int count = Clerk.productCount;

    public Customer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public synchronized void run() {
        while (true) {

            if (count > 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count--;
                System.out.println(Thread.currentThread().getName() + ":购买了第" + count + "个商品");
                notify();
            } else {
                System.out.println("货已售空,等待商家生产");
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

 

  • 写回答

2条回答 默认 最新

  • 起名字好烦啊 2020-11-13 11:54
    关注

    synchronized锁加在Clerk上好了,在主线程里创建一个clerk,传到两个线程里

    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么