java 并发——线程 (6)

使用举例:
假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:

public class Test { public static void main(String[] args) { int N = 8; //工人数 Semaphore semaphore = new Semaphore(5); //机器数目 for(int i=0;i<N;i++) new Worker(i,semaphore).start(); } static class Worker extends Thread{ private int num; private Semaphore semaphore; public Worker(int num,Semaphore semaphore){ this.num = num; this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); System.out.println("工人"+this.num+"占用一个机器在生产..."); Thread.sleep(2000); System.out.println("工人"+this.num+"释放出机器"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } }

运行结果:

java 并发——线程

五、线程辅助类总结

FutureTask 能够实现某个线程A等待另一个线程执行完任务,然后线程A再执行。并且线程A可以获取另一个线程执行的结果。

CountDownLatch 一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行。

CyclicBarrier 一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同。另外,CountDownLatch 不能够重用的,而 CyclicBarrier 是可以重用的。

Semaphore 其实和锁有点类似,它一般用于控制对某组资源的访问权限。



参考资料:
《java并发编程实战》
Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
并发工具类(一)等待多线程完成的CountDownLatch
并发工具类(二)同步屏障CyclicBarrier
并发工具类(三)控制并发线程数的Semaphore

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjpws.html