异步线程的复习以及CompletableFuture线程池的使用详解

1.初始化线程的四种方式

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)
  • 创建线程池

方式1和方式2:主进程无法获取线程的运算结果,不适合分布式的场景
方式3:主进程可以获取线程的运算结果,但是不利于控制服务器的线程资源。可能会导致服务器线程资源耗尽。
方式4: 通过初始化线程池可以保证线程的稳定,也可以获取到结果,并捕获异常,但是,在业务复杂的情况下,一个异步调用可能会依赖于另一个异步调用的执行结果

2.具体实现方式

//1.继承Thread
Thread thread=new Thread();
thread.start(); //启动线程

//2.实现Runnable接口
  Runnable runnable=new Runable01();
  new Thread(runnable).start();
  
//3.实现Callable接口+FutureTask
 FutureTask<Object> futureTask = new FutureTask<>(new Callable<Object>());
 new Thread(futureTask).start();
 //阻塞等待整个线程执行完成,获取返回结果
 Object o = futureTask.get();
//4.线程池(ExecutorService)
//给线程池提交任务
service.excute(new Runnable());
   //1.创建:
   // Excutors
   // new ThreadPoolExecutor
   //使用原生的线程池创建方式
  Future可以获取到异步结果
区别:
  1 2 不能得到返回值  3可以获取返回值
  1 2 3都不能获取资源
  4 可以控制资源,性能稳定
 //以后的代码里面,以上三种启动线程的方式都不采用
 //将所有的多线程的异步任务都交给线程池执行
 //处理高并发

3.开发中为什么使用线程池

降低资源的消耗

通过重复利用已经创建好的线程降低线程的创建和销毁带来的损耗

提高响应速度

因为线程池中的线程数没有超过线程池的最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能执行

提高线程的可管理性

线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。无限的创建和销毁线程不仅消耗系统资源,还降低系统的稳定性,使用线程池进行统一分配

4.原生线程池的七大参数解释

int corePoolSize

核心线程数{只要线程池不销毁,核心线程数一直在},线程池创建好以后就准备就绪的线程数量,就等待来接收异步任务去来执行

int maximumPoolSize

最大线程数,控制资源并发的

long keepAliveTime

存活时间,如果当前线程数量大于核心数量,只要线程空闲到一定时间内,就会释放空闲的最大线程数当中的线程

TimeUnit unit

具体最大线程数的存活时间的时间单位

BlockingQueue workQueue

阻塞队列 如果任务有很多,就会将目前多的任务放在队列里面,只要有空闲的线程,就会去阻塞队列去拿新的任务

ThreadFactory threadFactory

线程的创建工厂 默认 也可以自定义

RejectedExecutionHandler handler

拒绝策略,就是处理阻塞队列当中任务已满了,不能再加入其他的任务进来阻塞队列当中了,就进行指定的拒绝策略进行拒绝任务

5.工作顺序:

 1. 线程池创建,准备好核心数量的线程,准备接受任务
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值