线程的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的几个静态方法来创建不同功用的线程池


相关文章
|
27天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
124 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
4月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
115 1
|
4月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
125 0
|
3月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
85 12
|
2月前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####
|
2月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
95 4
|
5月前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
200 29
|
5月前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
4月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
83 2
|
4月前
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
69 1