多线程之Condition
来源:互联网 发布:手机淘宝主页怎么装修 编辑:程序博客网 时间:2024/06/17 13:33
简介
上面我们说了Lock,那是对synchronized的一种更为面向对象的替代,在原来的synchronized内部,我们可以调用object的wait与notify方法,那么使用lock之后,如何进行线程的通信呢?condition一方面是对lock功能的补充(也就是说,你用了lock,为了保证线程的通信,就得用condition)。
Condition实现多生产多消费模式
package com.example.demo.three.untils.condition;/** * @Author: CYM * @Description: * @Data: 2017/10/11 16:23 */import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.stream.IntStream;/** * Condition是一个wait notify替代 */public class ConditionTest1 { private final static Lock lock = new ReentrantLock(); private final static Condition pCondition = lock.newCondition(); private final static Condition cCondition = lock.newCondition(); private final static LinkedList<Long> timeList = new LinkedList<>(); private final static int MAX = 100; public static void main(String[] args) { IntStream.range(0, 6).boxed().forEach(ConditionTest1::beginProduce); IntStream.range(0, 10).boxed().forEach(ConditionTest1::beginConsume); } private static void beginProduce(int i) { new Thread(() -> { for (; ; ) { produce(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } }, "p-" + i).start(); } private static void beginConsume(int i) { new Thread(() -> { for (; ; ) { consume(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } }, "c" + i).start(); } private static void produce() { try { lock.lock(); while (timeList.size() >= MAX) { pCondition.await(); } long l = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + "-p-->>" + l); timeList.addLast(l); cCondition.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } private static void consume() { try { lock.lock(); while (timeList.isEmpty()) { cCondition.await(); } Long aLong = timeList.removeFirst(); System.out.println(Thread.currentThread().getName() + "--c->>" + aLong); pCondition.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }}
阅读全文
0 0
- JAVA多线程之Condition
- Java多线程之Condition
- 多线程之Condition
- Python 多线程之threading condition
- (七)java多线程之Condition
- JAVA多线程编程之Condition
- java多线程之Condition的使用
- Java多线程之Condition接口的实现
- Java多线程之Condition接口的实现
- Java多线程之Condition(一)
- java多线程之Condition的使用
- Java多线程之Condition接口的实现
- 多线程之线程通信条件Condition
- 多线程之线程通信条件Condition二
- Java基础:多线程之ReadWriteLock、Condition、Semaphore
- java多线程通信之lock和Condition
- 多线程Condition
- 多线程之8 -------Condition 实现线程同步通信
- Material Design Button波纹效果
- spring cloud踩坑日志(2)-日志文件的配置
- 第七周项目二建立链队算法库
- 第七周项目5-排队看病模拟
- linux软件安装指南
- 多线程之Condition
- 13.关于memcpy
- Flex 布局教程:语法篇
- Java中数据类型及其之间的转换
- mysql inner join 链接多个表
- SSH(spring+springmvc+hibernate)
- aop 切面
- Ajax的type四种取值区别
- 如何选择uv平板打印机?