JAVA 多线程使用Lock,Condition实现A,B,C,D依次执行,实现排它,同步通讯。
2019-09-14 07:06
1656 查看
package com.study; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class BlockingQueueDemo { public static void main(String[] args) { BlockingQueueDemo blockingQueueDemo = new BlockingQueueDemo(); final BlockingQueueClass blockingQueueClass = blockingQueueDemo.new BlockingQueueClass(); Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { blockingQueueClass.invokeA(); } } }); thread.start(); Thread thread2 = new Thread(new Runnable() { @Override public void run() { while (true) { blockingQueueClass.invokeB(); } } }); thread2.start(); Thread thread3 = new Thread(new Runnable() { @Override public void run() { while (true) { blockingQueueClass.invokeC(); } } }); thread3.start(); Thread thread4 = new Thread(new Runnable() { @Override public void run() { while (true) { blockingQueueClass.invokeD(); } } }); thread4.start(); } class BlockingQueueClass { Lock lock = new ReentrantLock(); Condition conditionA = lock.newCondition(); Condition conditionB = lock.newCondition(); Condition conditionC = lock.newCondition(); Condition conditionD = lock.newCondition(); boolean syncA = true; boolean syncB = false; boolean syncC = false; boolean syncD = false; public void invokeA() { lock.lock(); try { while (!syncA) { try { conditionA.await(); } catch (InterruptedException e) { e.printStackTrace(); } } syncA = false; syncB = true; System.out.println("invoke A...."); conditionB.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void invokeB() { lock.lock(); try { while (!syncB) { try { conditionB.await(); } catch (InterruptedException e) { e.printStackTrace(); } } syncB = false; syncC = true; System.out.println("invoke B...."); conditionC.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void invokeC() { lock.lock(); try { while (!syncC) { try { conditionC.await(); } catch (InterruptedException e) { e.printStackTrace(); } } syncC = false; syncD = true; System.out.println("invoke C...."); conditionD.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void invokeD() { lock.lock(); try { while (!syncD) { try { conditionD.await(); } catch (InterruptedException e) { e.printStackTrace(); } } syncD = false; syncA = true; System.out.println("invoke D...."); conditionA.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } } }
相关文章推荐
- JAVA多线程顺序执行(使用join,lock,condition,信号量)原理和java源代码
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- Java多线程与并发应用-(11)-用Lock+Condition实现1,2,3 三个模块按顺序执行。
- 多线程 不使用同步工具, 手动协调线程依次执行
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
- Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
- JAVA多线程-Lock的使用(一)-ReentrantLock与Condition
- Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
- 多线程 : 使用Lock 和 Condition 实现线程间互斥与通信
- java多线程之多生产者与多消费者案例之Lock和Condition实现方式
- Java多线程之~~~使用CountDownLatch来同步多个线程实现一个任务
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
- Java多线程实现及同步互斥通讯详解
- java:lock中使用多个condition实现通知特定线程
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- java多线程解说【柒】_锁实现:Lock/Condition的例子
- Java5 多线程(三)--Lock和Condition实现线程同步通信
- Java实现生产者与消费者(四)(多生产者与多消费者使用lock同步锁)
- Java多线程 之 lock与condition的使用(十四)
- 【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列