没有合适的资源?快使用搜索试试~ 我知道了~
java多线程编程
资源推荐
资源详情
资源评论
1 J.U.C 值 AQS
AQS:AbstractQueueSynchronizer 的缩写 同步器
底层使用的是双向列表,是队列的一种实现
Sync queue:同步列表
condition queue:单项链接
【线程池中包含的内容】
【AQS 设计】
1、使用 Node 实现了 FIFO 队列,可以用于构建锁或者其他同步装置的基础框架
2、利用了一个 int 类型表示状态,在 AQS 类中有一个叫做 state 的变量。
3、使用方法是继承:
4、子类通过继承并通过实现它的方法管理其状态(acquire 和 release)的方法操纵状态。
5、可以同时实现排它锁和共享锁模式(独占控制、共享控制)
1.1 AQS 的同步组件
1、CountDownLatch:B 锁通过计数保证线程是否需要一直阻塞。
2、Semaphore:保证同一时间,线程的并发数
3、CyclicBarrier:与 CountDownLatch 相似,都有阻塞线程。
4、ReentrantLock:
5、Conditon
6、FutureTask
1.2 AQS 同步组件--CountDownLatch
同步辅助类,通过它可以实现类似于同步阻塞类。一个线程或多个线程等待,直到其他线程操作完成。
通过一个给定的计数器,这个计数器操作具有原子性。同一时间只能有一个计数器调用该计数器。
【使用场景】
并行计算:一个计算拆成多个子任务,多个子任务结束,才计算最终的结果。
【CountDownLatch 的使用场景 1】
/**
* 保证 threadCount 执行了 200 次之后,才执行 finish
* @author tangxiaochun
*
*/
public class CountDownLatchExp1 {
private final static int threadCount=200;
public static void main(String[] args) throws Exception {
//定义一个线程池
ExecutorService exec=Executors.newCachedThreadPool();
final CountDownLatch countDownLatch=new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
//定义一个 final 的修饰的参数
final int threadNum=i;
exec.execute(()->{
try {
test(threadNum);
} catch (Exception e) {
System.out.println("=====程序异常=====");
}finally{
//每调用一次值减一,为 0 的时候执行 await 方法。
countDownLatch.countDown();
}
});
}
countDownLatch.await();
System.out.println("====finish===="+threadCount);
//当线程池不用的时候,需要关闭
exec.shutdown();
}
private static void test(int threadNum) throws Exception{
Thread.sleep(100);
System.out.println("=====threadNum======"+threadNum);
Thread.sleep(100);
}
}
【设置任务给定具体时间,时间到达,线程结束】
/**
* 设置给定时间,时间到,线程结束。
* @author tangxiaochun
*
*/
public class CountDownLatchExp2 {
private final static int threadCount=200;
public static void main(String[] args) throws Exception {
//定义一个线程池
ExecutorService exec=Executors.newCachedThreadPool();
final CountDownLatch countDownLatch=new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
//定义一个 final 的修饰的参数
final int threadNum=i;
exec.execute(()->{
try {
test(threadNum);
} catch (Exception e) {
System.out.println("=====程序异常=====");
}finally{
//每调用一次值减一,为 0 的时候执行 await 方法。
countDownLatch.countDown();
}
});
}
countDownLatch.await(10,TimeUnit.MILLISECONDS);
System.out.println("====finish===="+threadCount);
//当线程池不用的时候,需要关闭
exec.shutdown();
}
private static void test(int threadNum) throws Exception{
Thread.sleep(100);
System.out.println("=====threadNum======"+threadNum);
Thread. Sleep(100);
}
}
1.3 AQS 同步组件—Semaphore
类似信号量:控制并发访问的线程个数
【控制并发数量每次不超过 20—单个信号量】
/**
* 设置并发次数每次不能超过 20
* @author tangxiaochun
*
*/
public class SemaphoreExp1 {
private final static int threadCount=200;
public static void main(String[] args) throws Exception {
//定义一个线程池
ExecutorService exec=Executors.newCachedThreadPool();
//设置允许的并发数 20
final Semaphore semaphore=new Semaphore(20);
for (int i = 0; i < threadCount; i++) {
//定义一个 final 的修饰的参数
final int threadNum=i;
exec.execute(()->{
try {
//拿到许可
semaphore.acquire();
test(threadNum);
//释放许可
semaphore.release();
} catch (Exception e) {
System.out.println("=====程序异常=====");
}
});
}
System.out.println("====finish===="+threadCount);
//当线程池不用的时候,需要关闭
exec.shutdown();
}
private static void test(int threadNum) throws Exception{
System.out.println(new Date()+"=====threadNum======"+threadNum);
Thread.sleep(1000);
}
}
【一次释放或者获取多个许可】
public class SemaphoreExp1 {
private final static int threadCount=200;
public static void main(String[] args) throws Exception {
//定义一个线程池
ExecutorService exec=Executors.newCachedThreadPool();
//设置允许的并发数 20
final Semaphore semaphore=new Semaphore(20);
for (int i = 0; i < threadCount; i++) {
//定义一个 final 的修饰的参数
final int threadNum=i;
exec.execute(()->{
try {
//拿到许可
// semaphore.acquire();
//一次拿到三个许可,三个许可不结束,不能获取别的许可
semaphore.acquire(3);
test(threadNum);
//一次释放多个许可
semaphore.release(3);
} catch (Exception e) {
System.out.println("=====程序异常=====");
}
});
}
System.out.println("====finish===="+threadCount);
//当线程池不用的时候,需要关闭
exec.shutdown();
}
剩余28页未读,继续阅读
资源评论
雾林小妖
- 粉丝: 1w+
- 资源: 90
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- VR开发的概要介绍与分析
- 自动驾驶定位系列教程七:点云畸变补偿.pdf
- HM2302D-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- HM2302B-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- springboot学生考勤管理系统
- HM2302A-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- HM2301-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 数据可视化的概要介绍与分析
- HM2301E-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- HM2301D-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功