java学习网 java教程视频 java论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 333|回复: 69
收起左侧

Java并发工具类

  [复制链接]

503

主题

548

帖子

3428

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3428
发表于 2020-7-30 11:57:10 | 显示全部楼层 |阅读模式

为了满足并发程序的需要,JDK在以往的发展中增加了并发实用工具,这些工具中提供的诸如同步器、线程池、锁、并发集合等开发并发应用程序的特性,这类特性可以广泛的应用到各种情况,提高资源利用率,程序响应速度好,下面简单介绍一些并发常用的Java并发工具类。

并发工具位于java.util.concurrent包及其两个子包,两个子包分别是java.util.concurrent.atomic和java.util.concurrent.locks。



01
java.util.comcurrent包

java.util.comcurrent包定义了一些核心特征,用于以其他方式实现同步和线程间通信。如下表所示为java.util.concurrent包中几个常用的并发类描述。

1)Semaphore类

Semaphore实现了经典的信号量,通过计数器控制对共享资源的访问,可以用来控制线程并发数。如果计数器大于0,访问允许,如果计数器为0,访问是拒绝的,能够保证资源能被合理的使用,如图所示相似于队列,不断的检查队列是否已执行完的线程,如果执行完将其从队列中移除并加入新的线程,其余线程等待。

使用方法为:


Semaphore(int num):构造方法,指定初始化许可证num数量
void acquire():获取许可证
void release():释放许可证
int availablePermits() :返回此信号量中当前可用的许可证数。
int getQueueLength():返回正在等待获取许可证的线程数。
boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
void reducePermits(int reduction) :减少reduction个许可证。
Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。



2) CountDownLatch类

CountDownLatch允许一个或多个线程等待其他线程完成操作。内部通过一个计数器来实现,每当有一个线程执行完,计数器减1,当计数器为0时,所有线程执行完毕,已锁住的线程可以恢复执行。

使用方法为:



//这里的入参num指定了打开锁存器而必须发生的事件次数
CountDownLatch c = new CountDownLatch(num);
//计数  这个例子中总共需要调用num次countDown(),计数才结束
c.countDown();
//在主线程中调用,调用了这个方法后如果c没有计数到0则阻塞,直到计数为0,唤醒线程
c.await();


代码示例:

运行结果:

3)CyclicBarrier类

CyclicBarrier的意思为屏障,其功能是具有两个或多个线程的线程必须在预定的执行点进行等待,直到线程组中的所有线程都到达到执行点为止所有被阻塞的线程才会继续执行下去。

使用方法为:



//num指定在线程在继续执行之前必须要达到的线程数量。CyclicBarrier(int num) ;
//当每个线程到达预定的执行点时调用该方法,停止线程的执行,直到最后一个线程调用该方法时,所有线程被唤醒,进入运行态。
Int await() ;


4)Exchanger类

Exchanger用于线程之间的信息交换,促进线程之间的协同合作,实现为两个线程提供一个exchange()方法,当有一个线程调用时,等待另一个线程调用,当两个线程都调用exchange()方法时,进行信息交换。

使用方法为:



//V指定要进行交换的数据类型
Exchanger<V> e = new Exchanger<V>() ;
//等待另一个线程调用exchanger方法进行数据交换。
e.exchanger() ;


代码示例:

运行结果:

5) Phaser类

Phaser类允许一个或多个活动阶段的线程进行同步,首先设置每一阶段的结束位置,当所有线程完成这一阶段时,才能进行下一阶段。

使用方法为:



register():调用这个方法将一个新的线程注册到phaser中。Phaser中其他线程都会等待新注册的线程完成该阶段。
arrive():该方法通知某个执行线程已经完成某个阶段,但是他不会等待其他线程完成该阶段。
arriveAndAwaitAdvance():该方法指示某个线程已经完成该阶段然后等待其他线程全部完成该阶段。
arriveAndDeregister().该方法通知进程已经完成当前阶段的任务注销自身,不会参与到下一个阶段的执行。


02
java.util.concurrent.atomic

java.util.concurrent.atomic原子操作类包中提供了一组原子变量类,而不需要使用锁,能够支持原子的和有条件的读-改-写操作。包括AtomicInteger类、AtomicLong类、及compareAndSet(),getAndSet()方法等。

03
java.util.concurrent.locks

java.util.concurrent.locks包中定义了大量的锁定操作,比标准同步块更灵活、更复杂的线程同步机制,定义的核心是Lock接口,关键方法是lock(),tryLock()和unlock()。与同步块不同的是,Lock支持公平性,可保证最长的等待线程可以访问锁,可以中断等待锁线程等。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

34

帖子

50

积分

终身VIP会员

Rank: 5Rank: 5

积分
50
发表于 2020-8-16 06:27:10 | 显示全部楼层
顶一个
回复

使用道具 举报

0

主题

24

帖子

35

积分

终身VIP会员

Rank: 5Rank: 5

积分
35
发表于 2020-8-18 09:34:14 | 显示全部楼层
java是干什么的
回复

使用道具 举报

0

主题

30

帖子

44

积分

终身VIP会员

Rank: 5Rank: 5

积分
44
发表于 2020-8-18 13:29:26 | 显示全部楼层
java学习
回复

使用道具 举报

0

主题

30

帖子

44

积分

终身VIP会员

Rank: 5Rank: 5

积分
44
发表于 2020-8-18 13:32:07 | 显示全部楼层
java编程基础入门教程
回复

使用道具 举报

0

主题

8

帖子

11

积分

终身VIP会员

Rank: 5Rank: 5

积分
11
发表于 2020-8-19 19:08:04 | 显示全部楼层
java开发android教程
回复

使用道具 举报

0

主题

16

帖子

23

积分

终身VIP会员

Rank: 5Rank: 5

积分
23
发表于 2020-8-20 16:20:03 | 显示全部楼层
java下载教程
回复

使用道具 举报

0

主题

14

帖子

20

积分

终身VIP会员

Rank: 5Rank: 5

积分
20
发表于 2020-8-20 20:03:46 | 显示全部楼层
培训网java
回复

使用道具 举报

0

主题

18

帖子

26

积分

终身VIP会员

Rank: 5Rank: 5

积分
26
发表于 2020-8-21 23:11:54 | 显示全部楼层
学习java的视频
回复

使用道具 举报

0

主题

18

帖子

26

积分

终身VIP会员

Rank: 5Rank: 5

积分
26
发表于 2020-8-22 01:28:12 | 显示全部楼层
北大青鸟java教程费用多少
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

顶部qrcode底部
请扫码本站微信公众号

QQ|Archiver|手机版|sitemap.xml|java教程视频 ( 豫ICP备2020032868号 )

GMT+8, 2020-11-29 23:55

Powered by www.javaj.cn

Copyright © 2001-2020.

快速回复 返回顶部 返回列表