首页
学习
活动
专区
圈层
工具
发布

死磕 java线程系列之线程池深入解析——体系结构

简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己在面试中的表现,增加被录取的可能性。...体系结构 上图列举了线程池中非常重要的接口和类: (1)Executor,线程池顶级接口; (2)ExecutorService,线程池次级接口,对Executor做了一些扩展,增加一些功能; (3)ScheduledExecutorService...ForkJoinPool,新型线程池类,java7中新增的线程池类,基于工作窃取理论实现,运用于大任务拆小任务、任务无限多的场景; (8)Executors,线程池工具类,定义了一些快速实现线程池的方法...ForkJoinPool 新型线程池类,java7中新增的线程池类,这个线程池与Go中的线程模型特别类似,都是基于工作窃取理论,特别适合于处理归并排序这种先分后合的场景。...延时队列使用什么数据结构来实现的呢? 答:堆(DelayQueue中使用的是优先级队列,而优先级队列使用的堆;DelayedWorkQueue直接使用的堆)。

59030

编程体系结构(05):Java多线程并发

一、多线程导图 ? 二、多线程基础 1、基础概念 线程是操作系统能够进行运算调度的最小单位,包含在进程之中,是进程中的实际运作单位。...一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。...三、常见概念 1、线程优先级 线程调度器倾向执行线程优先级高的线程,线程优先级高说明获取CPU资源的概率高,或者获取的执行时间分片多,被执行的概率高但不代表优先级低的一定最后执行。...2、加锁机制 Lock接口:Java并发编程中资源加锁的根接口之一,规定了资源锁使用的几个基础方法。...1、基础方法 相关方法是Java中Object层级的基础方法,任何对象都有该方法:notify()随机通知一个在该对象上等待的线程,使其结束wait状态返回;wait()线程进入waiting等待状态,

1.2K51
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java的线程

    Java 的线程生命周期 不同的程序设计语言对于操作系统线程进行了不同的封装,下面我们学习一下 Java 的线程生命周期。...在操作系统层面,线程是会转换到休眠状态的,但是在 Java 虚拟机层面,Java 线程的状态不会发生变化,也就是说 Java 线程的状态会依然保持 RUNNABLE 状态。...而我们说的 Java 线程在调用阻塞式 API 时,线程会阻塞,指的是操作系统线程的状态,并不是 Java 线程的状态。 2....并且阻塞在 java.nio.channels.Selector 上时,如果其他的线程调用线程 A 的 interrupt() 方法,线程 A 的 java.nio.channels.Selector...-极客时间 (geekbang.org) 09 | Java线程(上):Java线程的生命周期 (geekbang.org) 06 | 线程池基础:如何用线程池设计出更“优美”的代码?

    48120

    java多线程—java线程的创建和线程的生命周期

    * 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。...* 因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。...* 1)线程的四种状态: 开始(等待) 、 运行 、 挂起 和 停止 ,这四种状态都可以通过Thread类中的方法进行控制 * 2)开始线程 * void start(): * void...可以通过Thread类的方法设置线程的各种属性 * 如: 线程优先级 (setPriority) 线程名(setName) 线程类型 (setDaemon) 等 * 调用start方法后,线程开始执行...* 但大多数操作系统平台上的Java虚拟机都无法精确到纳秒,因此,如果对sleep设置了纳秒,Java虚拟机将取最接近这个值的毫秒。 * ②.

    57220

    java多线程——线程的状态

    线程的状态转换如下图所示: 可以参考我的另一篇博客线程状态转换的内容。...* * @see java.lang.Thread#run() */ public abstract void run(); } 注释写的很清楚,这个接口用于创建一个线程...这个方法将创建一个执行run方法的新线程。 线程的中断 当线程的run方法执行方法体的最后一条语句并由执行return语句返回时,或者出现了在方法中没有捕捉的异常时,线程将终止。...值得注意的是,被中断的线程可以决定如何响应中断,一些重要的线程会在处理完异常后继续执行而不理会中断。...多线程(multithreaded):一个程序同时执行多个任务,可以同时执行一个以上线程的程序称为多线程程序。 多进程与多线程的本质区别在于:每个进程拥有自己的一整套变量,而线程则共享数据。

    95430

    Java多线程_Java线程池的大小与线程池死锁

    Java线程池的大小与线程池死锁 优化线程池大小 线程池大小对系统性能是有一定影响的,过大或者过小都会无法发挥最优的系统性能, 线程池大小不需要非常精确,只要避免极大或者极小的情况即可, 一般来说,线程池大小需要考虑...在书中给出一个估算线程池大小的公式: 线程池大小 = CPU的数量 * 目标CPU的使用率*( 1 + 等待时间与计算时间的比) 线程池死锁 如果在线程池中执行的任务A在执行过程中又向线程池提交了任务B...适合给线程池提交相互独立的任务,而不是彼此依赖的任务. 对于彼此依赖的任务,可以考虑分别提交给不同的线程池来执行。...Java线程池异常处理 在使用ThreadPoolExecutor进行submit提交任务时,有的任务抛出了异常,但是线程池并没有进行提示,即线程池把任务中的异常给吃掉了,可以把submit提交改为execute...执行,也可以对ThreadPoolExecutor线程池进行扩展.对提交的任务进行包装: package com.wkcto.threadpool; import java.util.concurrent

    1.2K40

    Java的多线程——多线程(3)线程安全

    解决方案:加锁是 Java 解决线程安全问题的主要方案。通过加锁,可将非原子操作打包成原子操作,确保同一时间只有一个线程能执行该操作。...此时第一次加锁成功后,第二次加锁会因为锁已被当前线程持有而进入阻塞等待,这种重复加锁是不必要的,却容易在开发中因代码结构问题写出。 2....Java synchronized的引入了可重入概念,针对这个线程的锁,他已经被使用了,引入了可重入性就不会阻塞了,而是继续往下执行,因为这把锁就是被这个线程所持有的。...Java内存模型(JMM):Java虚拟机规范中定义了Java内存模型....(如 Java 的synchronized锁遵循此特性) 不可抢占条件(不可剥夺)锁的基本特性:线程 1 获取锁后,线程 2 无法强行抢占该锁,只能阻塞等待线程 1 主动释放。

    38210

    Java并发Map的面试指南:线程安全数据结构的奥秘

    本文将探讨如何在Java中有效地应对这些挑战,介绍一种强大的工具——并发Map,它能够帮助您管理多线程环境下的共享数据,确保数据的一致性和高性能。...这就是并发Map派上用场的地方。并发Map是一种数据结构,它专为多线程环境设计,提供了一种有效的方式来处理共享数据。它允许多个线程同时读取和修改数据,同时确保数据的一致性和线程安全性。...高并发性: 跳表的结构允许多个线程并发地访问和修改数据,而不需要像分段锁那样精细的锁定。...结合分布式Map与其他并发数据结构在构建复杂的多线程应用程序时,通常需要将分布式Map与其他并发数据结构结合使用。...将并发Map与其他并发数据结构结合使用在多线程应用程序中,通常需要将并发Map与其他并发数据结构结合使用,以构建复杂的多线程应用程序并解决各种并发问题。

    64860

    Java并发Map的面试指南:线程安全数据结构的奥秘

    本文将探讨如何在Java中有效地应对这些挑战,介绍一种强大的工具——并发Map,它能够帮助您管理多线程环境下的共享数据,确保数据的一致性和高性能。...并发Map是一种数据结构,它专为多线程环境设计,提供了一种有效的方式来处理共享数据。它允许多个线程同时读取和修改数据,同时确保数据的一致性和线程安全性。...高并发性: 跳表的结构允许多个线程并发地访问和修改数据,而不需要像分段锁那样精细的锁定。...结合分布式Map与其他并发数据结构 在构建复杂的多线程应用程序时,通常需要将分布式Map与其他并发数据结构结合使用。...将并发Map与其他并发数据结构结合使用 在多线程应用程序中,通常需要将并发Map与其他并发数据结构结合使用,以构建复杂的多线程应用程序并解决各种并发问题。

    36720

    Java线程的学习—多线程(一)

    Java 标准库中Thread类可以视为是对操作系统提供的API进行了进⼀步的抽象和封装. 联系: Java 线程需要依赖操作系统线程来实现底层的运行和调度。...就像你用手机 APP(Java 线程),APP 的各种操作最终要靠手机系统(操作系统线程)来执行。...Java 虚拟机(JVM )在运行时会和操作系统交互,把 Java 线程映射到操作系统线程上 ,让 Java 线程能利用系统资源执行任务。...系统资源占用:操作系统线程有自己的线程栈、线程控制块等系统资源;Java 线程除了这些,还需要 Java 堆内存和栈内存,所以 Java 线程消耗的系统资源略多一些 。...应用程序(包括本地和远程的 Java 进程) 在路经中找放到它,点击 只会列出Java写的进程,其他语言的进程就不会出现 找到自己的项目然后连接 这是当前进程的线程,启动任何Java进程都会自带这些线程

    14510

    java线程的实现

    类和Runnable接口,相对来讲,更趋向于用Runnable 因为一个类可以实现多个接口,但是只能继承一个类,所以相对来说倾向用Runnable 第一种方法:用Thread 其实就是对父类Thread的继承和重写里面的方法...基本的思路还是java的继承多态思想 首先就是自己写一个类,继承Thread类,并重写run()方法 然后在调用函数中实现自己写的类,调用star()方法 注:调用start()方法实现多线程,调用run...()方法,是单线程的 public class FirstThread extends Thread{ public void run(){ for(int i=1;i的类, 然后生成Thread对象,并将接口对象作为参数 最后开始线程 注:调用start()方法实现多线程,调用run()方法,是单线程的 public class runable implements...{ //实现接口 runable ra=new runable(); //生成Thread对象,并将接口对象作为参数 Thread t=new Thread(ra); //开始多线程

    54710

    Java 多线程(2)---- 线程的控制

    包括线程的优先级、如何创建一个线程(通过继承 Thread 类或者通过新建 Runnable 对象并作为参数传入 Thread 的构造方法中)、线程的声明周期状态(新建状态、运行状态(就绪状态、正在运行状态...如果你对线程的一些概念还不熟悉,建议先从第一篇文章看起:Java 多线程(1)— 初识线程,当然,大神请无视这句话。 这篇文章我们来看一下 Java 多线程中对线程的控制。...如果我们需要暂停一个正在执行的线程时,我们可以通过调用该线程对象的 sleep(long millis) 方法来让该线程休眠指定的秒数,调用这个方法之后线程将会让出 CPU 进入休眠,休眠完成之后的线程并不会直接获得...我们可以想一下,要安全的结束线程,归根结底来说就是安全的使得线程的 run 方法结束运行。...在上面的方法解释中引入了一个 中断标志 的概念,这个可以理解成线程内部的一个 boolean 类型的字段,其本身不会影响线程的执行,但是和其他方法混用时,就有可能影响线程的执行。

    87740

    线程与Java线程

    Java线程是JVM进程的线程,由于多核系统的普及,充分发挥多核系统的调度优势,JVM较新版本所支持的所有平台上,大部分采用的是内核实现方式的线程模型。...即通过轻量级进程接口(LWP)调用系统的内核线程KLT,再通过操作系统的调度器进行线程的分配执行。 ? Java线程的在JVM内存结构中包括私有空间和共有空间,也就是Java虚拟机的内存模型。...根据虚拟机规范,Java线程私有的空间包括程序计数器,存放当前线程接下来要执行的字节码指令、分支、循环、跳转、异常处理等;Java虚拟机栈,生命周期与线程相同,在方法执行时都需要创建栈帧的数据结构,存放局部变量表...在JDK中代表线程的是Thread类,Java Thread定义了线程名、线程ID、优先级、是否守护线程、执行目标、线程组、线程状态等属性。...线程调度 线程调度就是为某个线程分配CPU的使用权的过程,这个过程一般分为抢占式调度和协同式调度。Java线程属于抢占式调度,每个线程都会分同样的执行时间片,每次执行时候涉及到上下文切换。

    2.1K30

    java 线程 (一) 线程的简单使用

    大家好,又见面了,我是你们的朋友全栈君。 大家好,从今天开始,我和大家一起来探讨 java 中线程的使用。...线程是 java 知识体系中非常重要的一部分,我将写一系列的文章来详细的介绍 java 线程中需要掌握的知识。如果你是 java 线程的初学者,本系列文章你一定不要错过哦。...本篇文章是 java 线程系列文章的第一篇文章,主要介绍进程与线程的概念和 java 中如何使用线程。...一个进程至少包含一个线程。 类似下图: 2 java 中如何创建线程 在了解了线程和进程的基本概念后,我们来学习一下 java 中的线程如何使用。...,该线程是不会执行的,它就和我们的普通的 java 对象一样。

    71320

    JEP 428:结构化并发,简化 Java 多线程编程

    ,命令应该是这样的: java --source 19 --enable-preview --add-modules jdk.incubator.concurrent Main.java jshell...例如,在上面的例子中,handle() 任务是父,它的子任务 findUser() 和 fetchOrder() 是子。结果,整个代码块变成了原子代码。它通过线程转储中的任务层次结构来提供可观察性。...这让并发代码的结构变得更加清晰,开发人员现在可以推理和跟踪代码,就好像它们是在单线程环境中运行。 早期的程序流程普遍使用 GOTO 语句来控制,代码十分混乱,这种意大利面条式的代码难以阅读和调试。...由于父任务和子任务将出现在线程转储不相关的线程调用堆栈上,因此调试也变得困难。尽管代码看起来具有逻辑结构,但这种结构只停留在开发人员的头脑中,而不是在执行过程中。所以,它们是非结构化的并发代码。...有兴趣深入了解结构化并发及其背景故事的开发者可以收听 InfoQ 的博客,或者观看 Ron Pressler 在YouTube上的分享以及Inside Java的文章。

    69210

    java创建线程池的几种方式_Java中的线程池

    Java创建线程池 线程池:4大方法,7大参数,4种拒绝策略 池化技术:把一些能够复用的东西(比如说数据库连接、线程)放到池中,避免重复创建、销毁的开销,从而极大提高性能。...优点: 降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗; 提高系统响应速度,当有任务到达时,无需等待新线程的创建便能立即执行; 方便线程并发数的管控,线程若是无限制的创建,不仅会额外消耗大量系统资源...当线程池中的线程空闲时间超过60s,则会自动回收该线程,当任务超过线程池的线程数则创建新的线程,线程池的大小上限为Integer.MAX_VALUE,可看作无限大。...maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。...threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号

    87840
    领券