您的位置:首页 > 编程语言 > Java开发

三个线程轮流执行顺序打印ABC(三):使用Lock实现

2017-12-10 16:26 681 查看
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。

思路:三个线程共享同一把锁、一个线程轮流状态state。线程拿到锁之后,通过state进行判断,如果轮到当前线程打印,则执行打印、更改state状态。每个线程都不停的循环,获取锁、判断state,执行打印,并……直到每个线程打印10次。

效率:由于三个线程不停的抢占锁,但是获取锁后不一定具备打印条件,所以性能比较低。

实现代码

package edu.self.multithread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* Created by SunYanhui on 2017/12/6.
*/
public class MultipleThreadRotationUsingExplicitLock {
public static void main(String[] args) {
PrintABCUsingReentrantLock printABC = new PrintABCUsingReentrantLock();
new Thread(() -> printABC.printA()).start();
new Thread(() -> printABC.printB()).start();
new Thread(() -> printABC.printC()).start();
}
}

class PrintABCUsingReentrantLock {
private Lock lock = new ReentrantLock();
private int state = 0;

//private int attempts =0;

public void printA() {
print("A", 0);
}

public void printB() {
print("B", 1);
}

public void printC() {
print("C", 2);
}

private void print(String name, int currentState) {
for (int i = 0; i < 10; ) {
lock.lock();
try {
//System.out.println(Thread.currentThread().getName()+" try to print "+name+", attempts : "+(++attempts));
while (state % 3 == currentState) {
System.out.println(Thread.currentThread().getName() + " print " + name);
state++;
i++;
}
}finally {
lock.unlock();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 线程
相关文章推荐