Java:线程并发工具类
来源:互联网 发布:mac 战网 改台服 编辑:程序博客网 时间:2024/06/05 02:33
一、CountDownLatch
1.应用场景
在实际多线程并发开发过程中,我们会碰见很多等待子线程完毕后在继续执行的情况,(如多个子线程下载文件,所有子线程执行完毕后再重命名为文件名)。
2.使用方式
CountDownLatch的构造函数接受一个int类型的参数作为计数器,调用countDwon()方法,计数器减1,await()方法阻塞当前线程,直到计数器变为0;、
补充:
计数器为0的时候,调用awaite()方法不会阻塞主线程;
初始化后,不能修改计数器的值;
可以使用await(long time,TimeUnit unit)等待特定时间后,就不阻塞主线程;
1.应用场景
如果当你遇见需要让一组线程达到同一个屏障(同步点)时被阻塞,直到最后一个线程达到屏障时,屏障才会打开的情况。
2.使用方式
CycliBarrier默认的构造方法CyclicBarrier(int parties),参数标识屏障拦截的线程个数,每个线程调用await()方法告诉SyclicBarrier我们已经达到屏障了,然后当前线程被阻塞。当所有子线程都达到屏障后,则继续执行子线程的后续逻辑。
补充:
CyclicBarrier还提供了一个更高级的函数CyclicBarrier(int parties,Runnable barrierAction),用于在线程达到屏障时,优先执行barrierAction。
3.实例代码
运行结果:当子线程都执行完第一个任务到达屏障后,执行下一个任务
三、Semaphore
1.应用场景
多线程访问公共资源的情况在开发过程中经常遇见,如数据库连接,可能开启几十个线程进行并发读取,但是考虑到数据库连接性能和消耗,我们必须控制10个线程哪个是连接数据库。Semaphore就是用来控制同时访问特定资源的线程数量。
2.使用方式
Semaphore的构造方法Semaphore(int permits),permits标识许可证数量。执行任务前,acquire()方法获取一个许可证;任务执行完成后调用relese()方法归还许可证。没有获得许可证的子线程就阻塞等待。
补充:
tryAcquire():尝试获取许可证;
intavaliablePermits():返回信号量中当前许可证的个数;
intgetQueueLength():返回正在等待获取许可证的线程个数;
booleanhasQueueThreads():是否有线程正在等待许可证;
reducePermits(int reduction):减少reduction个许可证;
getQueuedThreads():返回所有等待获取许可证的线程集合;
3.实例代码
运行结果:同时只有2个线程运行,当某个线程运行完毕释放许可后,下一个线程才获取许可运行;
四、Exchanger
1.应用场景
在某些实际业务如流水录入中,为了避免错误。采用两个人同时录入,并对比录入的结果是否一致。Exchanger用于进行线程之间的数据交换,它提供了一个同步点,两个线程可以交换彼此的数据。
2.使用方式
两个线程通过exchange()方法交换数据,如果一个线程执行exchange()方法,它会一直等待第二个线程也执行exchange()方法。当两个线程都达到同步点时,就可以交换数据,将本线程产生的数据传递给对方。
3.实例代码
1.应用场景
在实际多线程并发开发过程中,我们会碰见很多等待子线程完毕后在继续执行的情况,(如多个子线程下载文件,所有子线程执行完毕后再重命名为文件名)。
2.使用方式
CountDownLatch的构造函数接受一个int类型的参数作为计数器,调用countDwon()方法,计数器减1,await()方法阻塞当前线程,直到计数器变为0;、
补充:
计数器为0的时候,调用awaite()方法不会阻塞主线程;
初始化后,不能修改计数器的值;
可以使用await(long time,TimeUnit unit)等待特定时间后,就不阻塞主线程;
3.实例代码
运行结果:当Thread-1、Thread-0两个子线程执行完毕后,在运行main线程后续的逻辑 二、CyclicBarrier
1.应用场景
如果当你遇见需要让一组线程达到同一个屏障(同步点)时被阻塞,直到最后一个线程达到屏障时,屏障才会打开的情况。
2.使用方式
CycliBarrier默认的构造方法CyclicBarrier(int parties),参数标识屏障拦截的线程个数,每个线程调用await()方法告诉SyclicBarrier我们已经达到屏障了,然后当前线程被阻塞。当所有子线程都达到屏障后,则继续执行子线程的后续逻辑。
补充:
CyclicBarrier还提供了一个更高级的函数CyclicBarrier(int parties,Runnable barrierAction),用于在线程达到屏障时,优先执行barrierAction。
3.实例代码
运行结果:当子线程都执行完第一个任务到达屏障后,执行下一个任务
三、Semaphore
1.应用场景
多线程访问公共资源的情况在开发过程中经常遇见,如数据库连接,可能开启几十个线程进行并发读取,但是考虑到数据库连接性能和消耗,我们必须控制10个线程哪个是连接数据库。Semaphore就是用来控制同时访问特定资源的线程数量。
2.使用方式
Semaphore的构造方法Semaphore(int permits),permits标识许可证数量。执行任务前,acquire()方法获取一个许可证;任务执行完成后调用relese()方法归还许可证。没有获得许可证的子线程就阻塞等待。
补充:
tryAcquire():尝试获取许可证;
intavaliablePermits():返回信号量中当前许可证的个数;
intgetQueueLength():返回正在等待获取许可证的线程个数;
booleanhasQueueThreads():是否有线程正在等待许可证;
reducePermits(int reduction):减少reduction个许可证;
getQueuedThreads():返回所有等待获取许可证的线程集合;
3.实例代码
运行结果:同时只有2个线程运行,当某个线程运行完毕释放许可后,下一个线程才获取许可运行;
四、Exchanger
1.应用场景
在某些实际业务如流水录入中,为了避免错误。采用两个人同时录入,并对比录入的结果是否一致。Exchanger用于进行线程之间的数据交换,它提供了一个同步点,两个线程可以交换彼此的数据。
2.使用方式
两个线程通过exchange()方法交换数据,如果一个线程执行exchange()方法,它会一直等待第二个线程也执行exchange()方法。当两个线程都达到同步点时,就可以交换数据,将本线程产生的数据传递给对方。
3.实例代码
运行结果:线程1优先执行完毕,等待线程0执行完毕后,交换数据分别进行结果比较
阅读全文
0 0
- Java:线程并发工具类
- Java:线程并发工具类
- JAVA 并发编程-线程同步工具类(十二)
- 【5】Java并发编程:线程同步工具之CountDownLatch类
- JAVA 并发编程-线程同步工具类(十二)
- Java线程(CountDownLatch、CyclicBarrier、Semaphore)并发控制工具类
- Java并发工具类
- Java 并发工具类
- Java并发工具类
- Java并发工具类
- 线程并发学习----JUC工具类
- 线程并发工具--CyclicBarrier
- 线程并发工具--CountDownLatch
- 线程并发工具--Exchanger
- java并发之并发工具类
- Java并发编程(五)《并发工具类》
- Java并发工具类CountDownLatch
- Java并发工具类CyclicBarrier
- Oracle的to_date和java的SimpleDateFormat
- python日志回滚
- PHPSTORM/IntelliJ IDEA 常用 设置配置优化
- Python学习之基本数据类型(二)
- mysql使用
- Java:线程并发工具类
- 一个自用的进程间通信库(二)
- 0基础、英语差能学会Android开发吗?
- C++中字符串的表示
- setprecision、fixed、showpoint的用法总结 (经典!!超经典!!)
- HBase RPC理解之三
- 程序编程的本质
- 修改ubuntu默认键盘布局
- python 操作 mysql