需求:线程A 打印5遍,线程B打印10遍,线程C打印15遍。且线程A打印完才能打印线程B,线程B打印完才能打印线程C
package com.demo.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ShareResource{
int number = 1;
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print5(){
lock.lock();
try {
while(number!=1){
c1.await();
}
for(int i=1;i<=5;i++){
System.out.println(Thread.currentThread().getName()+"\t"+i);
}
number = 2;
c2.signal();
} catch (Exception 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();
} catch (Exception 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();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public class TestReentrantLock {
public static void main(String[] args) {
ShareResource shareResource = new ShareResource();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.print5();
}
},"AA").start();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.print10();
}
},"BB").start();
new Thread(()->{
for(int i=1;i<=10;i++){
shareResource.print15();
}
},"CC").start();
}
}
最后修改:2019-07-24 23:00:29
© 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
