import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class NewPlate { private List<Object> eggs = new ArrayList<Object>(); private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public Object getEgg() { lock.lock(); try { while(eggs.size() == 0) { try { condition.await(); } catch (Exception e) { e.printStackTrace(); } } Object egg = eggs.get(0); eggs.clear(); //清空 condition.signalAll(); System.out.println("拿到鸡蛋"); return egg; } finally { lock.unlock(); } } public void addEgg(Object egg) { lock.lock(); try { while(eggs.size() > 0) { try { condition.await(); } catch (Exception e) { e.printStackTrace(); } } eggs.add(egg); condition.signalAll(); System.out.println("放入鸡蛋"); } finally { lock.unlock(); } } public static void main(String[] args) { Plate plate = new Plate(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { exec.execute(new GetEggThread(plate)); exec.execute(new AddEggThread(plate)); } exec.shutdown(); } }
上面的实例不能体现出 Condition 魅力。看下面的程序:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class NewestPlate { private List<Object> eggs = new ArrayList<Object>(); private Lock lock = new ReentrantLock(); private Condition addCond = lock.newCondition(); private Condition getCond = lock.newCondition(); public Object getEgg() { lock.lock(); try { while(eggs.size() == 0) { try { getCond.await(); } catch (Exception e) { e.printStackTrace(); } } Object egg = eggs.get(0); eggs.clear(); //清空 addCond.signalAll(); System.out.println("拿到鸡蛋"); return egg; } finally { lock.unlock(); } } public void addEgg(Object egg) { lock.lock(); try { while(eggs.size() > 0) { try { addCond.await(); } catch (Exception e) { e.printStackTrace(); } } eggs.add(egg); getCond.signalAll(); System.out.println("放入鸡蛋"); } finally { lock.unlock(); } } public static void main(String[] args) { Plate plate = new Plate(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { exec.execute(new AddEggThread(plate)); exec.execute(new GetEggThread(plate)); } exec.shutdown(); } }
Condition 可以用来挂起、唤醒某个指定的线程。
相关推荐
python 条件同步的使用 条件同步:threading.Condition 多线程同步,python2例程 多线程的同步 多线程情况下最常见的问题之一:数据共享; 当多个线程都要去修改某一个共享数据的时候,需要对数据访问进行同步...
线程并发控制condition 互斥量 多线程写的:生产者、消费者问题
线程通信(Condition)实例,完整的代码文件,你只需要编译运行即可,就可以看看结果,然后分析。
多线程同步解决卖票问题
Condition是java.util.concurrent.locks包下的类,提供了对线程锁的更精细的控制方法,下面我们就来看一下Java多线程编程中使用Condition类操作锁的方法详解
主要介绍了Python线程协作threading.Condition实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
主要介绍了Java使用Condition控制线程通信的方法,结合实例形式分析了使用Condition类同步检测控制线程通信的相关操作技巧,需要的朋友可以参考下
这是陈硕在 2009 年上海 C++ 技术大会演讲《当析构函数遇到多线程》的 PPT 投影片,可自由用于个人学习,其他使用需得到作者许可。 简介:编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死...
多线程注意:wait()方法的调用要有判定条件常用 while (<condition does not hold>) obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的...
主要介绍了java多线程加锁以及Condition类的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: – wait:线程挂起,收到notify通知后继续运行 – notify:通知其他线程, 解除其它线程的wai状态 – ...
并发集合:JUC提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下安全地访问和修改集合。 原子操作:JUC提供了一些原子操作类,如AtomicInteger、AtomicLong等,可以...
在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...
主要介绍了Python中使用Queue模块和Condition对象进行线程同步的方法,配合threading模块下的线程编程进行操作的实例,需要的朋友可以参考下
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
python 多线程的同步机制 以python2例程的方式讲解了python 多线程的同步 常用的方法,主要是锁、条件同步、队列 多线程的同步 多线程情况下最常见的问题之一:数据共享; 当多个线程都要去修改某一个共享数据...
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6