一、线程间定制化通信概述
二、实现线程间定制化通信
1、需求
- 启动三个线程,线程 AA 执行 5 次打印,线程 BB 执行 10 次打印,线程 CC 执行 15 次打印,一共进行 3 轮
2、思路
- 每个线程设置一个标志位(flag),线程的标志位对应则执行操作,并修改为下一个线程的标志位,通知下一个线程
3、具体实现
(1)资源类
package com.my.customizedcommunicate;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ShareRecourse {
private int flag;
private Lock lock;
private Condition c1;
private Condition c2;
private Condition c3;
public ShareRecourse() {
flag = 1;
lock = new ReentrantLock();
c1 = lock.newCondition();
c2 = lock.newCondition();
c3 = lock.newCondition();
}
public void print5(int loop) {
lock.lock();
try {
while (flag != 1) {
c1.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + " 打印次数:" + i + " 轮数:" + loop);
}
flag = 2;
c2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print10(int loop) {
lock.lock();
try {
while (flag != 2) {
c2.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + " 打印次数:" + i + " 轮数:" + loop);
}
flag = 3;
c3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print15(int loop) {
lock.lock();
try {
while (flag != 3) {
c3.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + " 打印次数:" + i + " 轮数:" + loop);
}
flag = 1;
c1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
(2)多线程测试
package com.my.customizedcommunicate;
public class ShareRecourseTest {
public static void main(String[] args) {
ShareRecourse shareRecourse = new ShareRecourse();
Thread thread1 = new Thread(() -> {
for (int i = 1; i <= 3; i++) {
shareRecourse.print5(i);
}
}, "AA");
Thread thread2 = new Thread(() -> {
for (int i = 1; i <= 3; i++) {
shareRecourse.print10(i);
}
}, "BB");
Thread thread3 = new Thread(() -> {
for (int i = 1; i <= 3; i++) {
shareRecourse.print15(i);
}
}, "CC");
thread1.start();
thread2.start();
thread3.start();
}
}