为了账号安全,请及时绑定邮箱和手机立即绑定

一个生产者和多个消费者的互斥问题

一个生产者和多个消费者的互斥问题

ibeautiful 2019-03-06 12:11:56
运行后,消费者一直处于waiting状态,请问该怎么解决我的想法:生产者,因为使用list存放数据,直接添加数据就好;而消费者使用后,再删除使用数据List licenses = (ArrayList)obj;pool.addLicenses(licenses);消费者线程,其中pool为数据池:public void run() { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS"); TimeZone t = sdf.getTimeZone(); t.setRawOffset(0); sdf.setTimeZone(t);    synchronized(pool) {         while (true) {             String license = pool.getLicense();             System.out.println("Get "+license);         }     }以下是数据池,使用list存放数据package com.traffic.cache;import java.util.ArrayList;import java.util.List;public class LicensePool {private List<String> licenses = new ArrayList<String>(); public LicensePool() { } public synchronized void addLicenses(List<String> license) {     licenses.addAll(license);     notifyAll(); } public synchronized String getLicense(){     while(!haveLicense()) {         try {             System.out.println("Waiting");             wait();         } catch (InterruptedException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }     }     String l = licenses.get(0);     System.out.println(l);     licenses.remove(0);     return l; } public boolean haveLicense() {     if(licenses.isEmpty()){         return false;     }     return true; } public int getSize() {     return licenses.size(); }}
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

synchronized(pool)

锁没释放
addLicenses是执行不了的

while(!haveLicense()) {

一直为空

查看完整回答
反对 回复 2019-04-26
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

应该在LicensePool 内部对[quote] private List licenses[/quote]做锁同步,外面就可以不用[quote]synchronized(pool) {[/quote]


查看完整回答
反对 回复 2019-04-26
  • 2 回答
  • 0 关注
  • 1758 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信