‘!~淼 2020-09-08 09:27 采纳率: 0%
浏览 56

多线程模拟生产者和消费者模式--lock和condition中await()为什么没有生效

import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class LockCondition {
static class Conditiona{
static ConcurrentHashMap map = new ConcurrentHashMap<>();

}

//向外提供锁
static class GiveLockUtils{
private ReentrantLock lock;
private String key;
private static ConcurrentHashMap map;
public GiveLockUtils(String key){
synchronized (LockCondition.class) {
if(null == map){
map = new ConcurrentHashMap();
}
if (null == map.get(key)) {
this.lock = new ReentrantLock();
java.util.concurrent.locks.Condition condition = lock.newCondition();
map.put(key,lock);
map.put(key+"condition",condition);
}
}
}

    public ConcurrentHashMap<String,Object> getMap(){
        return this.map;
    }

}

static class Producer{
void producer(){
GiveLockUtils lock = new GiveLockUtils("User");
for (int i = 0; i < 10; i++) {
new Thread(()->{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ReentrantLock user = (ReentrantLock) lock.getMap().get("User");
Condition condition = (Condition)lock.getMap().get("Usercondition");
System.out.println(condition.toString());
user.lock();
try {
int value = new Random().nextInt();
Conditiona.map.put(value,value);
condition.signal();
}finally {
user.unlock();
}
}).start();
}
}
}

static class Concumer{
void foo() throws InterruptedException {
Thread thread = new Thread(() -> {
GiveLockUtils user = new GiveLockUtils("UserTwo");
ConcurrentHashMap map = user.getMap();
ReentrantLock lock = (ReentrantLock) map.get("User");
Condition condition = (Condition) map.get("Usercondition");
System.out.println("concumer:"+condition.toString());
lock.lock();
try {
if (user.getMap().size() < 10){
if (null == condition){
System.out.println("conditon为空");
}
condition.await();
System.out.println("没有进行终止");
}
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
System.out.println(Conditiona.map);
});
thread.start();
thread.join();
}
}
public static void main(String[] args) throws InterruptedException {
Producer producer = new Producer();
Concumer concumer = new Concumer();

    producer.producer();
    concumer.foo();



}

}


  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-09-08 13:35
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 这Mac系统提示虚拟内存不足,怎么解决
  • ¥15 Rs232电路无法收发数据,求帮助
  • ¥15 百度cookie扫码登录器
  • ¥15 微机原理汇编语言debug调试实验
  • ¥23 matlab可以把相图转换为庞加莱映射吗
  • ¥15 Arduino电机和openmv连接异常
  • ¥15 Arcgis河网分级报错
  • ¥200 java+appium2.1+idea
  • ¥20 请帮我做一个EXE的去重TXT文本
  • ¥15 工价表引用工艺路线,应如何制作py和xml文件