import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import static java.util.concurrent.ThreadLocalRandom.current; /** * @desc Condition使用案例 **/ public class ConditionExample { // 定义共享数据 private static int shareData = 0; // 定义布尔变量标识当前的共享数据是否已经被使用 private static boolean dataUsed = false; // 创建显式锁 private static final Lock lock = new ReentrantLock(); // 使用显式锁创建 Condition 对象并且与之关联 private static final Condition conditon = lock.newCondition(); // 对数据的写操作 private static void change() { // 获取锁,如果当前线程被其他线程持有,则当前线程会进入阻塞 lock.lock(); try { // 如果当前数据未被使用,则当前线程将进入 wait 队列, 并且释放 lock while(!dataUsed) { conditon.await(); } TimeUnit.SECONDS.sleep(current().nextInt(5)); shareData++; dataUsed = false; System.out.println("produce the new value:" +shareData ); // 通知并唤醒在 wait 队列中的其他线程 -- 数据使用线程 conditon.signal(); }catch (InterruptedException e) { e.printStackTrace(); } finally { // 释放锁 lock.unlock(); } } // 对数据的读操作 private static void use() { // 获取锁,如果当前锁被其他的线程持有,则当前线程会进入“阻塞状态” lock.lock(); try { // 如果当前数据已经使用,则当前线程将进入 wait 队列,并且释放 lock while(dataUsed) { conditon.await(); } TimeUnit.SECONDS.sleep(current().nextInt(5)); dataUsed = true; System.out.println("the shared data changed:"+ shareData); // 通知并唤醒 wait 队列中的其他线程---数据修改线程 conditon.signal(); }catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { // 创建并启动两个匿名线程 new Thread( ()-> { for(;;) { change(); } } ,"Producer").start(); new Thread( ()-> { for(;;) { use(); } },"Consumer").start(); } }
Condition使用案例
最新推荐文章于 2021-02-23 22:32:04 发布