上QQ阅读APP看书,第一时间看更新
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所示。
图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所示。
图1-4 同步运行了
说明使用代码:
private Semaphore semaphore = new Semaphore(1);
来定义最多允许1个线程执行acquire()和release()之间的代码,所以打印的结果就是3个线程是同步的。