今天看面试题碰到这么一题:有三个线程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(); 的许可数应该是一样的
初次接触,就这点了解,以后遇到了再深究
热门文章
- 3月1日→21.1M/S|2025年最新免费节点Clash/Shadowrocket/SSR/V2ray订阅链接地址
- 2月4日→23M/S|2025年最新免费节点Clash/Shadowrocket/SSR/V2ray订阅链接地址
- MySQL索引机制(详细+原理+解析)
- 1月31日→23M/S|2025年最新免费节点SSR/Shadowrocket/Clash/V2ray订阅链接地址
- 2月16日→21M/S|2025年最新免费节点Shadowrocket/Clash/V2ray/SSR订阅链接地址
- 实现宠物领养功能的意义(实现领养宠物的功能对象)
- 2月10日→20.2M/S|2025年最新免费节点Clash/V2ray/SSR/Shadowrocket订阅链接地址
- 瑜伽球哪个牌子的好用(瑜伽球哪个牌子的好一点)
- 宠物医院美团好评模板 宠物医院美团好评模板图片
- 3月9日→21.6M/S|2025年最新免费节点V2ray/SSR/Clash/Shadowrocket订阅链接地址