三个线程轮流执行顺序打印ABC(三):使用Lock实现
2017-12-10 16:26
681 查看
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。
思路:三个线程共享同一把锁、一个线程轮流状态state。线程拿到锁之后,通过state进行判断,如果轮到当前线程打印,则执行打印、更改state状态。每个线程都不停的循环,获取锁、判断state,执行打印,并……直到每个线程打印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(); } } } }
相关文章推荐
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- 三个线程轮流执行顺序打印ABC(一):使用Semaphore实现
- 有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在屏幕上顺序打印 ABC,打印10次。不准使用线程的sleep()
- 使用Lock,Condition解决三个线程依次轮流打印出75个数
- C#之使用AutoResetEvent实现线程的顺序执行
- C++ 11 三个线程打印ABC(顺序打印)
- 多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。
- 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
- Semaphore实现的三个线程协作循环打印10次ABC的方法
- 题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕打印10次ABC
- 多线程题 3个线程各打印一种字母,按顺序打印若干次ABC 的2种实现
- 详解使用synchronized解决三个线程依次轮流打印出75个数
- 有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在屏幕上顺序打印 ABC,打印10次。
- java多线程-使用ReentrantLock实现线程的顺序执行
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
- Java并发编程--三个线程顺序打印ABC
- 启动三个线程A,B,C,打印10次 按照ABC的顺序输出
- 有三个线程ID分别是A、B、C,请有多线编程 实现 在屏幕上循环打印10次ABCABC......
- condition实现三个线程顺序执行《2》
- java实现【有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABC.】