线程的3种实现方式并深入源码简单分析实现原理(3)

简介: 线程的3种实现方式并深入源码简单分析实现原理(3)
// 正确的函数式接口
@FunctionalInterface
public interface TestInterface {
    // 抽象方法
    public void sub();
    // java.lang.Object中的public方法
    public boolean equals(Object var1);
    // 默认方法
    public default void defaultMethod(){
    }
    // 静态方法
    public static void staticMethod(){
    }
}
// 错误的函数式接口(有多个抽象方法)
@FunctionalInterface
public interface TestInterface2 {
    void add();
    void sub();
}


方法修饰符 default


目的是让接口可以拥有具体的方法,让接口内部包含了一些默认的方法实现
如果一个类、类属变量及方法没有用任何修饰符
(即没有用public、protected及private中任何一种修饰)
则其访问权限为default(默认访问权限)


Callable&Future


Callable


image.png


Future


  • cancel(boolean mayInterruptIfRunning)


取消任务
参数:是否立即中断任务执行,或者等等任务结束


  • isCancelled()


任务是否已经取消,若已取消,返回true
若计算还没有开始,它被取消且不再开始。
若计算处于运行之中,那么如果mayInterrupt参数为true,它就被中断。


  • isDone()


任务是否已经完成。包括任务正常完成、抛出异常或被取消,都返回true


  • V get() throws InterruptedException, ExecutionException


等待任务执行结束,获得V类型的结果。
InterruptedException: 线程被中断异常,
ExecutionException: 任务执行异常,
如果任务被取消,还会抛出CancellationException


  • V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException


参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。
如果计算超时,将抛出TimeoutException
设置了超时时间可以防止程序无限制的等待future的返回结果


线程池


核心类


Executor


image.png


Executor类族是基于生产者-消费者思想设计的,
提交任务相当于生产者生产任务,
而执行任务相当于消费者消费任务


ExecutorService


继承Executor 添加了一些用于生命周期管理的方法


  • shutdown()


等待已经提交的任务完成


  • shutdownNow()


表示立即关闭


  • isShutdown和isTerminated


判断是否关闭或者终止


  • 三个submit


用于提交的任务,可以用Runnable作为任务,也可以用Callable作为任务


  • 工厂类Executors


用于创建线程池


1、newFixedThreadPool


image.png


image.png


image.png


image.png


小结

Executor为了解决多线程任务调度的问题,可以合理平衡系统吞吐量与内存管理。
Executor是一个最顶层的接口,为了更好管理Executor的生命周期,
便扩展了ExceutorService接口,该类有具体实现类ThreadPoolExecutor和ScheduledExecutorService。
并通过工厂类Executors的几个静态方法来创建不同功用的线程池


相关文章
|
16天前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
75 1
|
1月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
5月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
5月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
6月前
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
230 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
12月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
271 1
|
9月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
611 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
264 0
|
7月前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
302 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
11月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
217 12

热门文章

最新文章