![Java并发编程:核心方法与框架](https://wfqqreader-1252317822.image.myqcloud.com/cover/235/822235/b_822235.jpg)
上QQ阅读APP看书,第一时间看更新
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/icon1.png?sign=1738856203-m6rVQrkKf2FBRZAJgP5cNk28Sj703cRh-0-640a8b5eb47d32a46550b4bcfface8fd)
1.1.1 类Semaphore的同步性
多线程中的同步概念其实就是排着队去执行一个任务,执行任务是一个一个执行,并不能并行执行,这样的优点是有助于程序逻辑的正确性,不会出现非线程安全问题,保证软件系统功能上的运行稳定性。
那么本节就使用一个初步的案例来看看Semaphore类是如何实现限制线程并发数的。
创建实验用的项目SemaphoreTest1,类Service.java代码如下:
package service; import java.util.concurrent.Semaphore; public class Service { private Semaphore semaphore = new Semaphore(1); public void testMethod() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + " begin timer=" + System.currentTimeMillis()); Thread.sleep(5000); System.out.println(Thread.currentThread().getName() + " end timer=" + System.currentTimeMillis()); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
类Semaphore的构造函数参数permits是许可的意思,代表同一时间内,最多允许多少个线程同时执行acquire()和release()之间的代码。
无参方法acquire()的作用是使用1个许可,是减法操作。
创建3个线程类如图1-3所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0015_0001.jpg?sign=1738856203-03BWz6e7hnJjpc6YT9H5A5hdKmbgWHAr-0-2b4704419e6b250b7ea72f3548fd8cc9)
图1-3 线程数量为3
运行类Run.java代码如下:
package test; import service.Service; import extthread.ThreadA; import extthread.ThreadB; import extthread.ThreadC; public class Run { public static void main(String[] args) { Service service = new Service(); ThreadA a = new ThreadA(service); a.setName("A"); ThreadB b = new ThreadB(service); b.setName("B"); ThreadC c = new ThreadC(service); c.setName("C"); a.start(); b.start(); c.start(); } }
程序运行后的效果如图1-4所示。
![](https://epubservercos.yuewen.com/D3D8F4/4410924203007901/epubprivate/OEBPS/Images/figure_0016_0001.jpg?sign=1738856203-eY6gC0xOdOqQUbPz6GFLkWaAUX9S1j8i-0-4069e9b190f51dd97c6680ef85833fd2)
图1-4 同步运行了
说明使用代码:
private Semaphore semaphore = new Semaphore(1);
来定义最多允许1个线程执行acquire()和release()之间的代码,所以打印的结果就是3个线程是同步的。