package com.yyr.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @ClassName: LockTest2
* @Description: 用可重入锁模拟三个线程之间的通信
* @author: yangyr
* @date: 2019年11月9日 下午12:12:52
*
* @Copyright: 2019 www.briup.com All rights reserved.
*/
public class LockTest2 {
public static void main(String[] args) {
Out1 out = new Out1();
new Thread() {
@Override
public void run() {
while(true) {
try {
out.out1();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
@Override
public void run() {
while(true) {
try {
out.out2();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
@Override
public void run() {
while(true) {
try {
out.out3();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}.start();
}
}
class Out1{
ReentrantLock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
int flag = 1;
//线程1
public void out1() throws Exception {
lock.lock();//获取锁
if(flag!=1) {
c1.await();
}
System.out.print("hello ");
System.out.print("world");
System.out.print("!");
System.out.println("\r\n");
flag = 2;
c2.signal();
lock.unlock();//释放锁资源
}
public void out2() throws InterruptedException {
lock.lock();//获取锁
if(flag!=2) {
c2.await();
}
System.out.print("快乐");
System.out.print("Java");
System.out.print("!");
System.out.println("\r\n");
flag = 3;
c3.signal();
lock.unlock();//释放锁资源
}
public void out3() throws InterruptedException {
lock.lock();//获取锁
if(flag!=3) {
c3.await();
}
System.out.print("谁");
System.out.print("是");
System.out.print("废");
System.out.print("物");
System.out.print("?");
System.out.println("\r\n");
flag = 1;
c1.signal();//唤醒指定线程
lock.unlock();//释放锁资源
}
}
使用synchronized,wait(),notifyAll()实现方式如下:
java:多线程(三个或三个以上间的线程通信)_对抗路、余温的博客-CSDN博客
Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别: