/**
* 两个线程之间通信根据不同的条件进行不同的通信
* 1.await()其他程阻塞,要是当前线程向下执行,那么其他的线程必须唤醒它本身,这样当前线程才可以继续向下执行
* 2.signal()唤醒当前线程
*/
public class Main {
static class NumberWrapper {
public int value = 1;
}
public static void main(String[] args) {
//初始化可重入锁
final Lock lock = new ReentrantLock();
//创建两个线程
//1.读线程
//2.写线程
final Condition reachThreeCondition = lock.newCondition();
final Condition reachSixCondition = lock.newCondition();
final NumberWrapper num = new NumberWrapper();
//初始化A线程
//输出3的线程
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
//需要先获得锁
lock.lock();
try {
System.out.println("ThreadA start write");
//A线程先输出前三个数
while (num.value <= 3) {
System.out.println(num);
num.value++;
}
//输出到3时,告诉B线程,当前线程阻塞,唤醒,是一个互对的关系
reachThreeCondition.signal();
} finally {
lock.unlock(); //释放锁
}
lock.lock();
//等待输出6的条件
try {
reachSixCondition.await();
System.out.println("threadA start write");
//输出剩余数字
while (num.value <= 9) {
System.out.println(num.value);
num.value++;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
});
//输出6的线程
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
try {
//等待输出3的条件.当前的B线程阻塞,只有A线程满足3的条件输出了,那么
//才开始执行6的条件,这样是一个无线等待的情况,怎么获取每一个线程的执行结果
//1.要么通过参数进行参数的赋值关系,要么进行DB,这个是在项目中经常进行的操作
while (num.value <= 3) {
reachThreeCondition.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
lock.unlock();
}
lock.lock();
//接受到信号
try {
System.out.println("threadB start write");
while (num.value <= 6) {
System.out.println(num.value);
num.value++;
}
//4,5,6输出完毕,告诉A线程6输出完了
reachSixCondition.signal();
} finally {
lock.unlock();
}
}
});
//启动两个线程
threadB.start();
threadA.start();
}
可以参考以下的一个博客
https://www.cnblogs.com/hongdada/p/6150699.html
写的很详细,并且比较了Object类和当前类的方法的区别,以及用法