今天看面试题碰到这么一题:有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC...
具体答案先贴出来:
package com.joey.threadLocal; import java.util.concurrent.Semaphore; public class PrintABC { private static Semaphore semaphore1 = new Semaphore(0); private static Semaphore semaphore2 = new Semaphore(0); private static Semaphore semaphore3 = new Semaphore(0); public Thread t1; public Thread t2; public Thread t3; int count = 10; public PrintABC() { t1 = new Thread() { public void run() { try { semaphore3.release(); int i = 0; while(i++ < count) { semaphore3.acquire(); System.out.print("A"); semaphore1.release(); } } catch (Exception e) { e.printStackTrace(); } } }; t2 = new Thread() { public void run() { try { int i = 0; while(i++ < count) { semaphore1.acquire(); System.out.print("B"); semaphore2.release(); } } catch (InterruptedException e) { e.printStackTrace(); } } }; t3 = new Thread() { public void run() { try { int i = 0; while(i++ < count) { semaphore2.acquire(); System.out.print("C"); semaphore3.release(); } } catch (InterruptedException e) { e.printStackTrace(); } } }; } public void run() { t1.start(); t2.start(); t3.start(); } public static void main(String args[]) throws Exception { PrintABC t = new PrintABC(); t.run(); } }
这里面用到了java信号量Semaphore,首先讲一下
概念 :Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
那么我们看到,在上面的例子中创建了三个new Semaphore(0)示例,且创建时的传递到传递的参数为0,表示此时如果对象调用acquire()方法则获取不到许可,测试调用所在的线程将处于等待状态,只到有新的许可被释放。根绝这个逻辑就很容易理解上面的代码了,首先刚开始的时候t1,t2,t3三个线程只有t1不用等待,因为t2,t3两个线程的run()方法中首先对semaphore1和semaphore2申请一个许可,但此时这两个信号量示例的许可群为0,但是对于t1线程,它提前调用了semaphore3的release()方法,使semaphore3在之后调用acquire()方法去获取并消费一个许可时可以得到许可,之后semaphore1调用release()释放一个许可时下面的t2线程可以终止等待继续往下执行,以此类推.....
而且通过实验可以发现,每次调用一次release()则会增加一个许可,比如:
final Semaphore semp = new Semaphore(5); 的效果与 final Semaphore semp1 = new Semaphore(<span style="font-family:微软雅黑, 'MS Sans Serif', sans-serif;">0</span>); semp1.release(); semp1.release(); semp1.release(); semp1.release(); semp1.release(); 的许可数应该是一样的
初次接触,就这点了解,以后遇到了再深究
热门文章
- 狗粮牌子排行榜(“狗粮排名前十品牌”)
- 2月26日免费VPN节点 | 21.8M/S|2025年Shadowrocket/V2ray/SSR/Clash免费订阅链接地址
- Java基础之浅谈继承、多态
- 2月28日免费VPN节点 | 20.2M/S|2025年Shadowrocket/V2ray/SSR/Clash免费订阅链接地址
- 3月12日免费VPN节点 | 22.6M/S|2025年Shadowrocket/Clash/SSR/V2ray免费订阅链接地址
- 广州市宠物领养平台(广州宠物领养微信群)
- Vue3实践setup函数详解
- 快速了解Spring,简明Spring使用流程 – FITA _在线工具
- 2月18日免费VPN节点 | 18.3M/S|2025年SSR/V2ray/Shadowrocket/Clash免费订阅链接地址
- 做狗粮的机器多少钱一台(狗粮加工厂投资多少钱)