[8]-并发

宏观:concurrent包

  • atomic包: AtmoicInteger
  • locks包:Lock、Condition、ReetrantLock

  • Callable、Future
  • Exector、ExecutorService
  • CountDownLatch、CyclicBarrier
  • ConcurrentHashMap


//AtmoicInteger
//(预期值,新值) 当前值==预期值,当前值=新值 
public final int getAndIncrement(){
    for(;;){
        int current=get();
        int next=current+1;
        if(compareAndSet(current,next)){
            return current;
        }
    }
}


线程池:threadPoolExector.execute

  • coreNum、maxNum、
  • ThreadFactory、BlockingQueue、
  • 饱和策略、时间、时间单位)

  • amount< coreNum:ThreadFactory创建线程
  • amount< maxNum
    • 阻塞队列未满:BlockingQueue阻塞队列
    • 阻塞队列已满:ThreadFactory创建线程
  • amount>=max
    • 谁提交请求、谁处理
    • 抛异常、catch处理
    • 丢了这个请求
    • 丢了队列最早请求

线程让出cpu

  • yield():就绪:让给相同/更高:t1.setPriority(1-10,5)
  • wait():阻塞:释放锁
  • sleep():阻塞:不释放锁
  • join():阻塞:main调用t1.join(),main阻塞,直到t1结束

中止一个线程

  • suspend():立刻、不释放锁

  • interrupt():只能用于阻塞态,抛InterruptedException异常

    • wait:等锁;sleep:立刻;join:立刻
  • stop()
    • run()不同步:释放锁、抛ThreadDeath、可能不一致
    • run()同步:stop()也是同步,得不到锁、无法中止

synchronized

  • 提供了与对象相关的隐式监视器锁的访问
  • 锁的获取和释放要出现在一个块结构中,锁的释放是隐式的
  • 获取多个锁时, 必须以相反的顺序释放
  • JVM 在生成线程转储时能够包括锁定信息

ReentrantLock

  • Lock机制必须显式、在finally释放:locl.unlock()
    • 锁的获取和释放不必要在同一个块中
    • 释放锁的顺序更加自由

都是可重入锁

  • 同一个线程多次试图获取它所占有的锁,请求会成功。
  • 当释放锁的时候,直到重入次数清零,锁才释放完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 JDK8 中,可以使用 CompletableFuture 类来实现并发请求的合并。CompletableFuture 是一个实现了 Future 接口的类,提供了一系列方法来处理异步操作结果,包括合并多个 CompletableFuture 对象的结果。 使用 CompletableFuture 合并并发请求的步骤如下: 1. 创建多个 CompletableFuture 对象,每个对象代表一个异步请求。 2. 使用 CompletableFuture.allOf() 方法将多个 CompletableFuture 对象合并为一个新的 CompletableFuture 对象。 3. 使用 CompletableFuture.join() 方法获取合并后的结果。 示例代码如下: ``` CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { // 异步请求1 return "result1"; }); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { // 异步请求2 return "result2"; }); CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> { // 异步请求3 return "result3"; }); CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3); allFutures.join(); String result1 = future1.get(); String result2 = future2.get(); String result3 = future3.get(); // 处理合并后的结果 ``` 在上述示例中,我们创建了三个 CompletableFuture 对象来代表三个异步请求,并使用 CompletableFuture.allOf() 方法将它们合并为一个新的 CompletableFuture 对象。然后,我们使用 CompletableFuture.join() 方法等待所有异步请求完成,最后通过 CompletableFuture.get() 方法获取每个异步请求的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值