package com.freeflying.thread.reentrantlock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程多对多交替打印
* @ClassName: ManyToManyPrint
* @Description:
* @author freeflying
* @date 2018年8月20日
*/
public class ManyToManyPrint {
public static void main(String[] args) {
ManyToManyPrintEx printEx=new ManyToManyPrintEx();
ManyToManyPrintThreadA[] threadA = new ManyToManyPrintThreadA[10];
ManyToManyPrintThreadB[] threadB=new ManyToManyPrintThreadB[10];
for (int i = 0;
i < 10;
i++) {
threadA[i]=new ManyToManyPrintThreadA(printEx);
threadB[i]=new ManyToManyPrintThreadB(printEx);
threadA[i].start();
threadB[i].start();
}
}
}
class ManyToManyPrintEx{
private ReentrantLock lock=new ReentrantLock();
private Condition condition=lock.newCondition();
private boolean hasValue=https://www.it610.com/article/false;
public void set() {
try {
lock.lock();
while(hasValue==true) {
System.out.println("*");
condition.await();
}
hasValue=https://www.it610.com/article/true;
condition.signalAll();
} catch (Exception e) {
// TODO: handle exception
}finally {
lock.unlock();
}
}
public void get() {
try {
lock.lock();
while(hasValue==false) {
System.out.println("-");
condition.await();
}
hasValue=https://www.it610.com/article/false;
condition.signalAll();
} catch (Exception e) {
// TODO: handle exception
}finally {
lock.unlock();
}
}
}
class ManyToManyPrintThreadA extends Thread{
private ManyToManyPrintEx printEx;
public ManyToManyPrintThreadA(ManyToManyPrintEx printEx) {
super();
this.printEx = printEx;
}
@Override
public void run() {
for (int i = 0;
i < Integer.MAX_VALUE;
i++) {
printEx.set();
}
}
}
class ManyToManyPrintThreadB extends Thread{
private ManyToManyPrintEx printEx;
public ManyToManyPrintThreadB(ManyToManyPrintEx printEx) {
super();
this.printEx = printEx;
}
@Override
public void run() {
for (int i = 0;
i < Integer.MAX_VALUE;
i++) {
printEx.get();
}
}
}
结果
-
-
*
*
*
*
-
-
-
-
*
*
*
*
-
-
*
*
【线程多对多交替打印-condition】
推荐阅读
- 启动多个线程并按顺序执行
- java|使用线程Thread和Runnable输出1到100之间的偶数
- java多线程轮流打印数据问题
- Java|面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
- 【Java多线程实战设计】用三个线程按顺序循环打印abc三个字母,比如abcabcabc
- java多线程(循环输出ABC)
- JAVA并发编程——Callable接口和FutureTask简介和使用
- 多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。