| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 关于多线程的一些基本知识(二) -> 正文阅读 |
|
[Java知识库]关于多线程的一些基本知识(二) |
关于多线程的一些基本知识(二)一:Callable、Future接口下面截取JDK源码中 Thread类的注释部分。 目前我们学习了有两种创建线程的方法 但是,Runnable 缺少的一项功能是,当线程终止时(即 run() 完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口。 Callable 接口源码: Future的源码如下:
可以看得出来,Future提供了取消任务、获取任务执行的状态与获取结果的能力。 类图关系: 使用Callable接口创建线程:
二:Java中的线程池1、实现机制主线程使用ececute() 方法,向线程池中提交任务。 ①首先会先判断当前线程数是否超过了core Pool中规定的最大线程数,如果未超出,就会直接在core Pool中创建一个新的线程。②如果已经超出,创建线程的任务会进入阻塞队列BlockingQueue中进行等待。③如果core Pool和BlockingQueue都已经满了,则就会在max Pool中创建新的线程。④如果连max Pool中都满了,那么线程池就会采取一种饱和策略来解决问题(饱和策略在下面线程池的创建中会有介绍)。 2、线程池的创建
创建一个线程池时需要输入几个参数,如下:(七个核心参数) 1)corePoolSize(线程池的基本大小)。 2)maximumPoolSize(线程池最大数量)。 3)keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间。 4)TimeUnit(线程活动保持时间的单位)。 5)runnableTaskQueue(任务队列)。 6)ThreadFactory(线程工厂。用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字)。 7)RejectedExecutionHandler(四种饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。 3、向线程池提交任务execute()execute 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。 submit()submit 方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个对象可以判断任务是否执行成功,并且可以通过future的get 方法来获取返回值。 4、线程池的生命周期
1、线程池的五种状态,只能由小到大迁移,即-1 > 0 > 1 > 2 > 3 。 2、shutdown()不清空任务队列、会等它们完成, shutdownNow()会清空任务队列、不等它们完成。shutdown()只中断空闲的线程, shutdownNow()会中断所有的线程。 3、TIDYING 和 TREMINATED二者之间执行了一个钩子函数 terminated(),目前这是一个空的实现(自己可以去实现自己的业务需求)。 三:理解同步异步与阻塞非阻塞同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。 异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。 阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。 非阻塞:进程给CPU传达任务后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。 下面举个段子说明一下 同步异步与阻塞非阻塞(段子) 老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1、老张把水壶放到火上,立等水开。(同步阻塞) 2、老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞) 3、老张把响水壶放到火上,立等水开。(异步阻塞) 4、老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。 所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。 所谓阻塞非阻塞,仅仅对于老张而言。 四:阻塞队列详情介绍在下面的两篇文章: 生产者消费者模型:https://blog.csdn.net/A12115419/article/details/120152178 阻塞队列: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:49:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |