JUC(4)Callable和常用的辅助类

简介: 这篇文章介绍了Java并发工具包中的`Callable`接口及其与`Runnable`的区别,以及几个常用的并发辅助类,如`CountDownLatch`、`CyclicBarrier`和`Semaphore`,并提供了它们使用方式的示例代码。

1、Callable

在这里插入图片描述

  • 1、可以有返回值
  • 2、可以抛出异常
  • 3、方法不同、run()/call()

在这里插入图片描述
在这里插入图片描述
future Task

在这里插入图片描述
在这里插入图片描述
细节:

  • 1、有缓存
  • 2、结果可能需要等待,会阻塞

2、常用的辅助类

在这里插入图片描述

2.1 CountDownLatch

package com.add;

import java.util.concurrent.CountDownLatch;

//计数器
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        //总数是6
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"-->GO OUT");
                countDownLatch.countDown();//减法操作
            },String.valueOf(i)).start();

        }
        countDownLatch.await();//判断是否到零,到零执行下一步
        System.out.println("Close");
    }

}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2 CyclicBarrier

package com.add;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
    public static void main(String[] args) {
        //召唤龙珠
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召唤神龙成功");
        });

        for (int i = 0; i <7 ; i++) {
            final int temp = i;
          new Thread(()->{
              System.out.println(Thread.currentThread().getName()+"收集了"+temp+"个龙珠");
              try {
                  cyclicBarrier.await();
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } catch (BrokenBarrierException e) {
                  e.printStackTrace();
              }
          }).start();

        }
    }
}

在这里插入图片描述
在这里插入图片描述

2.3 Semaphore

package com.add;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {
    public static void main(String[] args) {

        Semaphore semaphore = new Semaphore(3);

        for (int i = 0; i <6 ; i++) {
            new Thread(()->{
                //acquire()得到
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"--->抢到停车位");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName()+"--->离开停车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }

                //release()释放
            },String.valueOf(i)).start();

        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

原理

  • semaphore.acquire(); 获得,假设如果已经满了,等待,等待被释放为止
  • semaphore.release(); 释放,会将当前的信号量释放+1,然后唤醒等待的线程

作用:多个共享资源互斥的使用,并发限流,控制最大的线程数。

相关文章
|
7月前
|
Java
JAVA JUC Callable 接口
【1月更文挑战第5天】JAVA JUC Callable 接口
|
2月前
|
Java C++
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
38 0
|
7月前
|
Java 程序员
Java多线程基础-16:简述Java并发编程JUC中的Callable接口
Callable接口是Java中用于描述带有返回值任务的接口,与Runnable相对,后者无返回值。Callable的call()方法用于执行具体任务并返回结果。
98 0
|
监控 安全 Java
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
|
存储 Java
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(三)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(一)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(三)
|
存储 监控 安全
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(二)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(二)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(一)
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架
《JUC并发编程 - 基础篇》 Callable接口 | 辅助类 | 读写锁 | 阻塞队列 | 线程池 | Stream流 | 分支合并框架(一)
|
设计模式 缓存 Java
JUC并发编程学习(七)-Callable学习
JUC并发编程学习(七)-Callable学习
JUC并发编程学习(七)-Callable学习
|
SpringCloudAlibaba 前端开发 Java
JUC系列(四) callable与 常用的工具类
在多线程工作中常用的一些辅助类
JUC系列(四) callable与 常用的工具类
|
前端开发
JUC 走进Callable
JUC 走进Callable
145 0
JUC 走进Callable