上QQ阅读APP看书,第一时间看更新
1.1.13 多进路-单处理-多出路实验
本实现的目标是允许多个线程同时处理任务,但执行任务的顺序却是同步的,也就是阻塞的,所以也称单处理。
创建实验用的项目Semaphore_MoreToOne_2,将Semaphore_MoreToOne_1项目中的所有源代码复制到项目Semaphore_MoreToOne_2中,更改类Service.java代码如下:
package service; import java.util.concurrent.Semaphore; import java.util.concurrent.locks.ReentrantLock; public class Service { private Semaphore semaphore = new Semaphore(3); private ReentrantLock lock = new ReentrantLock(); public void sayHello() { try { semaphore.acquire(); System.out.println("ThreadName=" + Thread.currentThread().getName() + "准备"); lock.lock(); System.out.println("begin hello " + System.currentTimeMillis()); for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "打印" + (i + 1)); } System.out.println(" end hello " + System.currentTimeMillis()); lock.unlock(); semaphore.release(); System.out.println("ThreadName=" + Thread.currentThread().getName() + "结束"); } catch (InterruptedException e) { e.printStackTrace(); } } }
在代码中加入了ReentrantLock对象,保证了同步性。
程序运行结果如图1-25所示。
图1-25 打印循环中的内容为有序
在单处理步骤中实现了同步,所以打印的效果呈1,2,3,4,5这样的顺序。