千家信息网

java中常用的并发工具有哪些

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要讲解了"java中常用的并发工具有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java中常用的并发工具有哪些"吧!1)闭锁Count
千家信息网最后更新 2025年02月06日java中常用的并发工具有哪些

这篇文章主要讲解了"java中常用的并发工具有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java中常用的并发工具有哪些"吧!

1)闭锁CountDownLatch

功能:让一个主线程等待一组工作线程执行完毕之后,才继续执行主线程,与join()方法的功能类似。原理:        1)CountDownLatch是通过一个计数器来实现的,计数器的初始值为需要等待线程的数量。        2)当一个线程完成了自己的任务后,计数器的值就会减1。        3)当计数器值为0时,说明所有的线程都执行完了,此时,在闭锁上等待的线程就可以恢复执行任务。注意:        1)countDown()可以在每个线程中调用一次,也可以在一个线程中调用多次。        2)计数器必须大于等于0,计数器为0时,调用await方法时不会阻塞当前线程。

2)屏障(栅栏)CyclicBarrier

功能:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门(trip),所有被屏障拦截的线程才会继续运行。CyclicBarrier和CountDownLatch的区别:        1)CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置。        2)到达某个点后,使用CountDownLatch的线程继续运行,使用CyclicBarrier的线程停止运行:                使用CountDownLatch的线程运行到某个点之后,调用 countDown() 方法将计数器的值减1,之后线程继续执行。                使用CyclicBarrier 的线程运行到某个点之后,调用 await()           方法使该线程停止运行,直到所有的线程都到达了这个点(调用await方法),(所有的)线程才可以继续运行。

3)信号量Semaphore

功能:控制并发的线程数。原理:        1)线程通过acquire()方法获取许可证。        2)线程通过release()方法归还许可证。说明:使用tryAcquire()方法可以立即得到执行的结果:尝试获取一个许可证,若获取成功,则立即返回true,若获取失败,则立即返回false。        应用:流量控制,例如数据库连接数的控制等。

4)交换者Exchanger

功能:两个线程间数据的交换。原理:        1)线程A调用public V exchange(V dataA)方法,线程A到达同步点,并且在线程B到达同步点前一直等待。        2)线程B调用public V exchange(V dataB)方法,线程B到达同步点。        3)线程A与线程B都达到同步点时,线程将自己的数据传递给对方,两个线程完成了数据的交换了。         举例:        public class ExchangerTest {                public static void main(String[] args) {                                                final Exchanger exchanger = new Exchanger();                                                ExecutorService service = Executors.newFixedThreadPool(2);                        service.execute(new Runnable() {                                public void run() {                                        try {                                                String originalData = "dataA";                                                Thread.sleep(2000);                                                System.out.println("线程" + Thread.currentThread().getName() + "正在把数据[" + originalData + "]传递出去..." + "      time:" + System.currentTimeMillis());                                                String exchangedData = exchanger.exchange(originalData);                                                System.out.println("线程" + Thread.currentThread().getName() + "获取到另一线程的数据[" + exchangedData + "]" + "       time:" + System.currentTimeMillis());                                        } catch (Exception e) {                                                e.printStackTrace();                                        }                                }                        });                        service.execute(new Runnable() {                                public void run() {                                        try {                                                String originalData = "dataB";                                                Thread.sleep(6000);                                                System.out.println("线程" + Thread.currentThread().getName() + "正在把数据[" + originalData + "]传递出去..." + "      time:" + System.currentTimeMillis());                                                String exchangedData = exchanger.exchange(originalData);                                                System.out.println("线程" + Thread.currentThread().getName() + "获取到另一线程的数据[" + exchangedData + "]" + "       time:" + System.currentTimeMillis());                                        } catch (Exception e) {                                                e.printStackTrace();                                        }                                }                        });                }        }                结果:                线程pool-1-thread-1正在把数据[dataA]传递出去...    time:1506414528645                线程pool-1-thread-2正在把数据[dataB]传递出去...    time:1506414532645                线程pool-1-thread-2获取到另一线程的数据[dataA]      time:1506414532645                线程pool-1-thread-1获取到另一线程的数据[dataB]      time:1506414532645

感谢各位的阅读,以上就是"java中常用的并发工具有哪些"的内容了,经过本文的学习后,相信大家对java中常用的并发工具有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

线程 数据 方法 计数器 运行 功能 屏障 常用 正在 同步 原理 许可证 学习 控制 两个 任务 内容 结果 阻塞 成功 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 贵阳软件开发公司主要哪些 梦幻西游大唐盛世在哪个服务器 rfid识别软件开发 程序员软件开发有奖金嘛 政府网络安全调研 自学网络技术组建 我的世界手机版封神斗罗服务器 软件开发和运行的软件环境 安卓平板远程登录阿里云服务器 网络安全内容结构 数据库安全威胁包晗 如何搭建多用户linux服务器 数据库原理基本查询习题 加强网络安全防电信诈骗 网络技术面试题目 数据库行业与网络安全行业 数据库原理大连外国语大学 河南乐善网络技术 票务管理服务器的功能 数据库是指那些数据的集合 中国网络安全审查技术与认中心 给网络安全饭圈乱象的海报 国内真正的互联网科技公司 汽车空调控制器软件开发 幼师网络安全心得体会 淮南门店管理软件开发公司哪家好 富士通软件开发 数据库营销的内容包括 王者营地如何改服务器 liunx怎么退出数据库
0