异步编排与多线程

异步

初始化线程的4种方式

  1. 继承thread

  2. 实现Runnable接口

  3. 实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)jdk1.5后添加的 可以将Callable转化为Future Future内部继承Runable接口

  4. 线程池

  5. 定义一个配置类,改配置类向容器中注入一个threadPoolExecutor

  6. `@Configuration
    public class MyThreadConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties threadPoolConfigProperties){

    return new ThreadPoolExecutor(threadPoolConfigProperties.getCoreSize(), threadPoolConfigProperties.getMaxSize(), threadPoolConfigProperties.getKeepAliveTime() ,TimeUnit.SECONDS, new LinkedBlockingDeque<>(10000), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    

    }
    }`
    线程池的属性配置可以写进属性文件中
    之后就可以在组件中使用了
    @Autowired
    private ThreadPoolExecutor executor;

  7. 线程池的执行流程 一个线程池core7, max 20, queue 50, 100并发进来是怎么分配的
    首先100并发里有7个线程通过core线程执行,再讲50个线程放入队列中,当阻塞队列满了还有线程,就开max线程,这是最大为20,所以还会有13个线程会执行,如果还有线程就会执行指定的拒绝策略。

当异步任务有一个执行顺序时,需要进行异步编排
6. CompletableFuture 异步编排 是future接口的实现类,future有一个get方法,可以获取线程执行的结果 使用函数式接口

两个方法

  1. supplyAsync(Supplier supplier, Executor executor)
@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

由于Supplier接口定义了一个get方法所以可以返回执行结果
3. runAsync(Runnable runnable, Executor executor)
不返回执行结果
4. whenComplete(BiConsumer<? super T, ? super Throwable> action)
感知异常 给出默认结果
这里能获取异常信息 但是没法修改数据

在Java中,多线程异步编排通常涉及到使用并发库,如`java.util.concurrent`包提供的工具。其中一些关键组件包括: 1. **Future和Callable**: `Callable`接口用于异步计算任务,它返回一个`Future`对象,可以获取计算结果或检查是否完成。你可以通过提交`Callable`到`ExecutorService`来启动任务,并通过`Future.get()`阻塞等待结果。 2. **ExecutorService**: 这是一个服务,负责管理和调度提交给它的Runnable或Callable任务。常见的实现有`ThreadPoolExecutor`, `ScheduledExecutorService`等。 3. **Thread池** (`ThreadPoolExecutor`): 提供一组预先创建的线程,可以高效地处理大量并发任务,避免频繁创建销毁线程的开销。 4. **CompletableFuture**: 是Java 8引入的一个高级API,它提供了更简洁的方式来处理异步操作的结果。可以链式调用 `.thenApply()`, `.thenAccept()`, `.thenRun()` 等方法来组织复杂的异步流程。 5. **异步回调**: 当你需要在某个操作完成后立即执行其他操作时,可以使用`Runnable`和`Consumer`接口,它们提供了一种简单的回调机制。 6. **FutureTask**: 可以将一个Callable封装成一个Future,这使得Callable的任务能够像Runnable一样在ExecutorService中运行。 异步编程有助于提高系统的响应性和吞吐量,因为任务可以在后台线程中并行执行,而主线程则继续处理用户交互。然而,需要小心管理资源和同步问题,以防数据竞争和死锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值