admin管理员组文章数量:1599534
ReentrantLock之Condition用法
题目
题目:多线程之前按顺序调用,实现A->B->C三个线程启动,要求如下:
A打印5次,B打印10次,C打印15次
紧接着
A打印5次,B打印10次,C打印15次
…
来5轮
Demo
package com.lly.test;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程操作资源类
*/
class SharedResource {
/**
* 1代表A线程
* 2代表B线程
* 3代表C线程
*/
private volatile int number = 1;
private final ReentrantLock lock = new ReentrantLock();
private final Condition c1 = lock.newCondition();
private final Condition c2 = lock.newCondition();
private final Condition c3 = lock.newCondition();
public void print5() {
lock.lock();
try {
// 判断
while (number != 1) {
// System.out.println("await1...");
// 等待
c1.await();
// System.out.println("await2...");
}
// 干活
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
// 通知
number = 2;// 修改标志位
c2.signal();// 通知B
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print10() {
lock.lock();
try {
// 判断
while (number != 2) {
// 等待
c2.await();
}
// 干活
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
// 通知
number = 3;// 修改标志位
c3.signal();// 通知C
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void print15() {
lock.lock();
try {
// 判断
while (number != 3) {
// 等待
c3.await();
}
// 干活
for (int i = 1; i <= 15; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
// 通知
number = 1;// 修改标志位
c1.signal();// 通知A
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
/**
* @Description
*
* 题目:多线程之前按顺序调用,实现A->B->C三个线程启动,要求如下:
* A打印5次,B打印10次,C打印15次
* 紧接着
* A打印5次,B打印10次,C打印15次
* ......
* 来5轮
*
* @Author lyluo
* @Date 2021/2/2
*/
public class ReentrantLockDemo {
public static void main(String[] args) {
SharedResource sharedResource = new SharedResource();
int num = 5;
for (int i = 1; i <= num; i++) {
new Thread(() -> {
sharedResource.print5();
}, "A").start();
}
for (int i = 1; i <= num; i++) {
new Thread(() -> {
sharedResource.print10();
}, "B").start();
}
for (int i = 1; i <= num; i++) {
new Thread(() -> {
sharedResource.print15();
}, "C").start();
}
}
}
本文标签: ReentrantLockcondition
版权声明:本文标题:ReentrantLock之Condition用法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728322567a1154017.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论