线程池原理和实例,线程池的结构和原理

首页 > 经验 > 作者:YD1662022-11-03 06:03:39

runWorker方法是线程池的核心:

1、线程启动之后,通过unlock方法释放锁,设置AQS的state为0,表示运行中断;

2、获取第一个任务firstTask,执行任务的run方法,不过在执行任务之前,会进行加锁操作,任务执行完会释放锁;

3、在执行任务的前后,可以根据业务场景自定义beforeExecute和afterExecute方法;

4、firstTask执行完成之后,通过getTask方法从阻塞队列中获取等待的任务,如果队列中没有任务,getTask方法会被阻塞并挂起,不会占用cpu资源;

getTask实现

线程池原理和实例,线程池的结构和原理(17)

整个getTask操作在自旋下完成:

1、workQueue.take:如果阻塞队列为空,当前线程会被挂起等待;当队列中有任务加入时,线程被唤醒,take方法返回任务,并执行;

2、workQueue.poll:如果在keepAliveTime时间内,阻塞队列还是没有任务,则返回null;

所以,线程池中实现的线程可以一直执行由用户提交的任务。

Future和Callable实现

通过ExecutorService.submit()方法提交的任务,可以获取任务执行完的返回值。

线程池原理和实例,线程池的结构和原理(18)

在实际业务场景中,Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果。

1、Callable接口类似于Runnable,只是Runnable没有返回值。

2、Callable任务除了返回正常结果之外,如果发生异常,该异常也会被返回,即Future可以拿到异步执行任务各种结果;

3、Future.get方法会导致主线程阻塞,直到Callable任务执行完成;

submit实现

线程池原理和实例,线程池的结构和原理(19)

通过submit方法提交的Callable任务会被封装成了一个FutureTask对象。

FutureTask

线程池原理和实例,线程池的结构和原理(20)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.