美文网首页
异步和线程池

异步和线程池

作者: 闻乐 | 来源:发表于2021-07-20 12:58 被阅读0次

四种方式创建线程

1.通过Thread类创建线程

Thread01 thread = new Thread01();

thread.start();

2.通过实现Runnable接口

Runable01 runable01 = new Runable01();

new Thread(runable01).start();

3.通过实现Callable接口 + FutureTask 实现   ,可以拿到返回值

FutureTask<Integer> futureTask = new FutureTask<>(new Callable01());

new Thread(futureTask).start();

//阻塞等待线程执行完拿到返回值

Integer integer = futureTask.get();

4.通过线程池实现

我们以后在业务代码里面,以上三种启动线程的方式都不用,将所有多线程的异步任务都交给线程池来实现

固定线程数量大小的线程池

区别:1,2不能得到返回值,3可以得到返回值

1,2,3都不能控制资源

4可以控制资源

ExecutorService  service  = Executors.newFixedThreadPool(10);

service.execute(()->{})

//原生线程池

//7大参数

corePoolSize:核心线程数;线程池创建好以后就准备就绪的线程数量,就等待来接收异步任务去执行。

maximumPoolSize:最大线程数量,控制资源

keepAliveTime:存活时间,当前正在运行的线程数量大于核心数量,

unit:时间单位

BlockingQueue<Runnable> workQueue 阻塞队列,如果任务有很多,就会将目前多的任务放到阻塞队列里面,线程有空闲,就会去队列里面取新的任务继续执行

threadFactory:线程创建的工程

RejectedExecutionHandler handler:如果队列满了,按照我们指定的拒绝策略拒绝执行任务

ThreadPoolExecutor pool = new ThreadPoolExecutor();

1.线程池创建,准备好core数量的核心线程,准备接受任务

2.新的任务进来,用core准备好的空闲线程执行

    1>core满了,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行

    2>阻塞队列满了,就直接开新线程执行,最大只能开到max指定的数量

    3>max都执行好了,max-core的数量空闲的线程会在keepAliveTime指定的时间后自动销毁。最终保持到core大小

3.所有线程都由线程池创建

工作顺序

1)线程池创建,准备好core数量的核心线程,准备接受任务。

2)core满了,就将新进来的任务放入阻塞队列中,空闲的core就会自己去阻塞队列获取任务执行

3)阻塞队列满了,就直接开新线程,最大只能开到 max指定的数量

4)max满了就调用RejectedExecutionHandler执行拒绝任务

5)max都执行好了,max-core的数量空闲的线程会在keepAliveTime指定的时间后自动销毁。最终保持到core大小

new LinkedBlockingDeque<>():默认是Integer最大值,内存不够

面试题:一个线程池 core 7 max20 queue 50 ,100个并发任务是怎么分配的

core 进7个立即执行

队列里面放进50个

再开13个新线程执行

剩下30个使用拒绝策略执行

Executors.newCachedThreadPool() core是0.所有都可回收

newFixedThreadPool() 固定大小,core =max,都不可回收

newScheduledThreadPool() 定时任务的线程池

newSingleThreadPool() 单线程线程池

开发中为什么要是有线程池

1.降低资源的消耗

2.提高响应速度

3.提高线程的可管理性

在业务复杂的情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。

Future是java5添加的类,用来描述一个异步计算的结果,可以使用isDone方法检查计算

相关文章

  • 异步和线程池

    四种方式创建线程 1.通过Thread类创建线程 Thread01 thread = new Thread01()...

  • AsyncTask的使用及其原理

    概述 Android 已封装好的轻量级异步类。内置一个线程池用于异步任务,另一个线程池用于排队(实际不是线程池)。...

  • Spring Boot 配置异步Async方法

    注解启动类 添加线程池配置 标注异步方法-不带返回值 标注异步方法-不带返回值 线程池的调用过程 核心线程池未满时...

  • 线程池

    多线程使用:使用注解方式注入线程池进行异步任务,避免手动方式创建线程池

  • java并发基础-线程池

    线程池主要解决两个问题:当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接...

  • [C# 线程处理系列]专题二:线程池中的工作者线程

    目录: 一、上节补充 二、CLR线程池基础 三、通过线程池的工作者线程实现异步 四、使用委托实现异步 五、任务 一...

  • 聊聊Java线程池原理

    线程池是很常用的并发框架,几乎所有需要异步和并发处理任务的程序都可用到线程池。使用线程池的好处如下: 降低资源消耗...

  • 假如让你自己写个图片加载框架,你会考虑哪些问题?

    异步加载:线程池由于网络会阻塞,所以读内存和硬盘可以放在一个线程池,网络需要另外一个线程池,网络也可以采用Okht...

  • NIO.2-异步通道组

    异步通道组 每个异步通道都属于一个通道组,它们共享一个 Java 线程池,该线程池用于完成启动的异步 I/O 操作...

  • 异步和线程池配置

    一、异步1、@EnableAsync表示开启异步,可以放在@Controller层上方,也可以放在Applicat...

网友评论

      本文标题:异步和线程池

      本文链接:https://www.haomeiwen.com/subject/zcaopltx.html