三个线程轮流执行顺序打印ABC(一):使用Semaphore实现
2017-12-07 15:18
453 查看
需求:有三个线程轮流执行,第一个线程打印A,第二个线程打印B,第三个线程打印C……循环10次。
思路:三个线程对应三个Semaphore,三个Semaphore维护一个Permit。当前线程通过对应的Semaphore获取Permit,执行打印,并通过下一个线程对应的Semaphore释放Permit。类似于Permit在当前的线程对应的Semaphore中,传递到了下一个线程对应的Semaphore中。下一个线程通过对应的Semaphore获取Permit,继续执行……循环10次。
效率:每个线程使用一个Semaphore,一个Permit在不同的Semaphore之间循环传递,当前线程消费完Permit后,无法立即进行下一次打印,而下一个线程使用的Semaphore刚好获取到了Permit,从而使线程可以交替执行。不需要额外的线程轮流状态state字段。代码简洁,效率高。
实现代码:
思路:三个线程对应三个Semaphore,三个Semaphore维护一个Permit。当前线程通过对应的Semaphore获取Permit,执行打印,并通过下一个线程对应的Semaphore释放Permit。类似于Permit在当前的线程对应的Semaphore中,传递到了下一个线程对应的Semaphore中。下一个线程通过对应的Semaphore获取Permit,继续执行……循环10次。
效率:每个线程使用一个Semaphore,一个Permit在不同的Semaphore之间循环传递,当前线程消费完Permit后,无法立即进行下一次打印,而下一个线程使用的Semaphore刚好获取到了Permit,从而使线程可以交替执行。不需要额外的线程轮流状态state字段。代码简洁,效率高。
实现代码:
package edu.self.multithread; import java.util.concurrent.Semaphore; /** * Created by SunYanhui on 2017/12/4. */ public class MultipleThreadRotationUsingSemaphore { public static void main(String[] args) { PrintABCUsingSemaphore printABC = new PrintABCUsingSemaphore(); new Thread(() -> printABC.printA()).start(); new Thread(() -> printABC.printB()).start(); new Thread(() -> printABC.printC()).start(); } } class PrintABCUsingSemaphore { private Semaphore semaphoreA = new Semaphore(1); private Semaphore semaphoreB = new Semaphore(0); private Semaphore semaphoreC = new Semaphore(0); //private int attempts = 0; public void printA() { print("A", semaphoreA, semaphoreB); } public void printB() { print("B", semaphoreB, semaphoreC); } public void printC() { print("C", semaphoreC, semaphoreA); } private void print(String name, Semaphore currentSemaphore, Semaphore nextSemaphore) { for (int i = 0; i < 10; ) { try { currentSemaphore.acquire(); //System.out.println(Thread.currentThread().getName()+" try to print "+name+", attempts : "+(++attempts)); System.out.println(Thread.currentThread().getName() +" print "+ name); i++; nextSemaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
相关文章推荐
- 三个线程轮流执行顺序打印ABC(三):使用Lock实现
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- Semaphore实现的三个线程协作循环打印10次ABC的方法
- 有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在屏幕上顺序打印 ABC,打印10次。不准使用线程的sleep()
- 启动三个线程A,B,C,打印10次 按照ABC的顺序输出
- java多线程-使用ReentrantLock实现线程的顺序执行
- 多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。
- 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
- java 线程上机题 循环唤醒 三个线程轮流打印 顺序 A线程->B线程->C线程
- java使用CountDownLatch实现线程顺序执行
- java实现【有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABC.】
- Java并发面试题:三个线程轮流打印十次abc
- 三个线程顺序打印ABC
- 多线程题 3个线程各打印一种字母,按顺序打印若干次ABC 的2种实现
- 三个线程分别打印ABC,按顺序输出ABCABC...
- C++ 11 三个线程打印ABC(顺序打印)
- Java并发编程--三个线程顺序打印ABC
- 写一个程序三个线程分别输出A,B,C, 顺序输出ABC十次,用java实现
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc