1 回答

TA贡献1802条经验 获得超5个赞
您正在使用可运行对象的单个实例Producer5,并将其多次提交给执行服务。
Producer5 producer = new Producer5(queue, maxCapacity);
pool.execute(producer);
pool.execute(producer);
pool.execute(producer);
pool.execute(producer);
pool.execute(producer);
因此,threadName该单个实例中的字段Producer5将被覆盖多次并且没有用(它将不再打印出实际正在运行的线程的名称,此外,它需要被volatile多个线程正确更新 -对于正确的一些定义)。
System.out.println(String.format("\nProducer %s has lock",
threadName // this will be the name of the last thread that entered `run`,
// they all share the same instance
));
Runnable如果同一实例包含可变状态,请勿重复使用该实例。为每个执行线程创建一个单独的实例。
当生产者线程 t1 持有锁时,消费者线程 t5 如何获得锁?
仍然是线程 t1 运行此代码,但该threadName字段同时已由线程 t5 更新。高度误导性的输出。
似乎除了一个生产者和消费者之外的所有线程都已死亡,并且这两个线程正在彼此之间切换锁。
线程都仍然处于活动状态,但只有两个threadName字段存在,线程轮流更新它们(在方法的顶部run),最终确定某个值。所有线程现在只打印该值。
添加回答
举报