首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java线程池让使用线程变得更加高效

这个问题要看业务系统执行的任务更多的是计算密集型任务,还是I/O密集型任务。大家可以从这两方面来回答面试官。...(1)如果是计算密集型任务,通常情况下,CPU个数为N,设置N + 1线程数量能够实现最优的资源利用率。...因为N + 1线程保证至少有N线程利用CPU,提高了CPU利用率;同时不设置过多的线程也能减少线程状态切换所带来的上下文切换消耗。...(2)如果是I/O密集型任务线程的主要等待时间是花在等待I/O操作,另外就是计算所花费的时间。一般可以根据这个公式得出线程池合适的大小配置。..., // 池中允许的最大线程数 long keepAliveTime, // 当线程数大于corePoolSize时,多余的空闲线程终止之前等待新任务的最长时间

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

关于线程池你不得不知道的一些设置

看完我一篇文章「你都理解创建线程池的参数?」之后,当遇到这种问题,你觉得你完全能够唬住面试官了,50k轻松到手。殊不知,要是面试官此刻给你来个反杀: 初始化线程池时可以预先创建线程?...ThreadPoolExecutor线程池中,还有一些不常用的设置。我建议如果您在应用场景中没有特殊的要求,就不需要使用这些设置。 初始化线程池时可以预先创建线程?...你可能会想到corePoolSize的数量设置为0,从而线程池的所有线程都是“临时”的,只有keepAliveTime存活时间,你的思路也许时正确的,但你有没有想过一很严重的后果,corePoolSize...如果allowCoreThreadTimeOut=true,核心线程规定时间内会被回收。...上面我也说了,当线程空闲时会从blockingQueue阻塞队列中阻塞获取任务执行,所以我们来看看是保证核心线程不被销毁的,我们直接定位到源码部位: java.util.concurrent.ThreadPoolExecutor

81030

驾驭Java线程池:定制与扩展

Executor是一强大多线程工作框架,其不仅提供了完善的执行策略便于用户使用,还提供多样的接口和参数供用户自定义配置,保证了框架的可扩展性和灵活性。本文将为大家介绍如何配置和使用线程池。 1....依赖性任务:大多数任务都是相互独立的,但是有些情况下 ,任务之间会有依赖的关系,这个时候就需要维护任务之间的依赖关系,保证他们都能提交并允许,所以线程池应该足够大;如果一被提交,而另一因饱和而被丢弃...使用线程封闭机制的任务:和线程池相比,单线程的Executor是可以保证线程安全的。如果一利用线程封闭机制的任务,就要求Executor是单线程的的来执行,否者就会有并发安全问题。...对响应时间敏感的任务:如果一时间敏感的任务提交到只包含着少量进程的Executor时,就很难保证任务的响应能力,降低用户体验,这时候就要求进程池足够的大,以提高响应速度,同时任务应该响应中断,以防止耗时过多...当一元素被的放入同步队列时,要求必须有一线程(作为工作者)正在等待使用这个元素。如果线程池发现并没有线程等待,且线程池大小没有达到最大时,便会新创建一线程作为工作者去消费该任务

55320

Java 面试题全记录 多处搜集 灵魂拷问 持续更新

为什么 8 的时候树化,4 不可以,等等 concureentHashMap,段锁,如何分段,和 hashmap hash 的区别,性能,等等 HashTable,同步锁,这块可能会问你 synchronized...ABC 三线程如何保证顺序执行 13. 生产者消费者模式的实现方式 14. 如何实现控制线程某段时间内完成,不完成就撤销 ## JVM 1. JVM 的内存区域 2....四、多线程/并发 · 如何创建线程?如何保证线程安全? · 如何实现一线程安全的数据结构 · 如何避免死锁 · Volatile关键字的作用? · HashMap线程环境下使用需要注意什么?...kill掉一线程?...· 你列举一使用了Visitor/Decorator模式的开源项目/库? · 你在编码时最常用的设计模式有哪些?什么场景下用? · 如何实现一单例?

71021

java相关技术问答(二)

String为什么是final的 首先是为了安全性,final表示不可变,不可被继承,不能修改其方法保证安全 线程环境下,final类型的String保证线程安全 String支持字符串常量池,相同字符串可以指向相同地址...那v值更新成n线程线程数配置多少合适?...=(线程io阻塞时间/io运行时间+1)*cpu数 为什么redis单线程还这么快 redis虽然是单线程,但他的操作完全是在内存进行的,内存的速度比IO快很多,可以有效提高cpu的利用率 ThreadPoolExecutor...所以集群前先解决上述问题,使用单独的分布式任务调度系统管理所有定时任务,系统代码该优化的优化,接口需要保证幂等性 随着集群化,并发量qps肯定能上来。...多用于检测对象是否从内存中移除 hashMapjdk1.7和1.8的区别 1.8链表的基础加入了红黑树,当链表长度超过8,链表结构变成红黑树模式,降低时间复杂度 但要使用这个优势,key必须时间比较接口

35520

面试官问:“项目中用过多线程?”你就把这个案例讲给他听!

这里有两思路: 所有数据取到集合(内存)中,然后进行切割,每个线程推送不同段的数据 利用 数据库分页的方式,每个线程取 [start,limit] 区间的数据推送,我们需要保证start的一致性...Callable接口,这样方便获取线程任务执行的结果,示例里用于统计线程推送成功的数量 class PushDataTask implements Callable { 使用 ThreadPoolExecutor...synchronized的优化能说一说? 从JDK1.6版本之后,synchronized本身也不断优化锁的机制,有些情况下他并不会是⼀很重量级的锁。...再来说内存屏障的问题,volatile修饰之后会加⼊不同的内存屏障来保证可⻅性的问题正确执⾏。...任务分为计算密集型、IO密集型、混合型。 计算密集型一般推荐线程池不要过大,一般是CPU数 + 1,+1是因为可能存在页缺失(就是可能存在有些数据硬盘中需要多来一线程数据读入内存)。

1.3K10

线程池源码研究

答案是ThreadPoolExecutor, 这个类里面有ctl的原子类。ctl高 3 位用来表示线程池状态,后 29 位用来记录线程线程个数。 所以线程池里面线程的最大只有2的28次方-1。...问题如下: work线程什么时候才start(),如何定义的 work线程怎么实现阻塞获取任务 线程池操作如何做到线程安全 首先我们看第一问题,我也一直比较好奇。这个work线程是特殊封装过的。...看下执行线程的流程: 从上面的图可以看出,submit/execute之后【区别:execute返回void,submit返回Future】,如果线程池是正常工作,就会启动Worker(); 我们新增任务的时候...有一点比较重要,ThreadPoolExecutor许多获取线程状态的方法都是使用属性mainLock来保证线程安全的。...= 0; for (Worker w : workers) if (w.isLocked()) // 保证准确性

39000

concurrent.futures:线程池、进程池,让你更加高效、并发的处理任务

# 如果不指定,那么每一任务都会为其创建一线程 executor = ThreadPoolExecutor() # 通过submit就直接任务提交到线程池里面了,一旦提交,就会立刻运行 # 提交之后...还记得线程池的一叫做max_workers的参数?...控制线程池内线程数量的,我们可以最大的任务数设置为2,那么当第三任务进去的时候,就不会执行了,而是处于等待状态 from concurrent.futures import ThreadPoolExecutor...print(future3.cancel()) # True """ sleep 5 sleep 2 """ # 可以看到打印为True,说明取消成功了 # 而sleep 4也没有被打印 而事实我们启动线程池的时候...,肯定是需要设置容量的,不然处理几千任务要几千线程

1.3K20

java(7)-多线程线程

突发性大量客户请求,没有线程池情况下,产生大量线程,尽管理论大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。 四....()方法: 实际是Executor中声明的方法,ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一任务...实际中,如果Executors提供的三静态方法满足要求,就尽量使用它提供的三方法,因为自己去手动配置ThreadPoolExecutor的参数有点麻烦,要根据实际任务的类型和数量来进行配置。   ...,而是直接新建一线程来执行新来的任务。...CPU密集型任务:配置尽可能少的线程数量,如配置Ncpu+1线程线程池。cpu密集型任务需要大量的运算,而且没有阻塞,需要CPU一直全速运行,CPU密集任务只有真正的多核CPU才可能得到加速。

43410

JAVA线程线程池(七)

3.多线程下操作系统处理的时候,CPU时间片的增强就会有一频繁的切换系统上下文,每个线程都想被运行,导致每个线程都执行的很慢,不能专心执行某一线程。...工作线程线程池中线程没有任务时处于等待状态,可以循环的执行任务。...该线程池确保任务按加入的顺序一依次执行。当唯一的线程任务异常终止时,创建一新的线程来执行后续的任务。...newScheduledThreadPool(int corePoolSize)定时执行任务线程池。...// 使用SynchronousQueue作为工作队列的前提下,客户端代码向线程池提交任务时, // 而线程池中又没有空闲的线程能够从SynchronousQueue队列实例中取一任务

1K20

线程池不得不说的秘密……

threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n线程池内的线程编号...判断线程池中当前线程数是否大于核心线程数,如果小于,创建一新的线程来执行任务,如果大于则 判断任务队列是否已满,没满则将新提交的任务添加在工作队列,已满则。...混合型任务 可以任务分成IO密集型和CPU密集型任务,然后分别用不同的线程池去处理。只要分完之后两任务的执行时间相差不大,那么就会比串行执行来的高效。...(保证线程数可控,不会造成线程过多,导致系统负载更为严重) 3、newSingleThreadExecutor:创建一线程线程池,适用于需要保证顺序执行各个任务。...2、submit(),提交一线程任务,有返回值。 submit(Callable task)获取到它的返回值,通过future.get()获取(阻塞直到任务执行完)。

18610

当面试官问线程池时,你应该知道些什么?

默认情况下,创建了线程池后,线程池中的线程数为 0,当有任务来之后,就会创建一线程去执行任务,当线程池中的线程数目达到 corePoolSize 后,就会把到达的任务放到缓存队列当中。...重要方法 ThreadPoolExecutor 类中有几个非常重要的方法: execute() 方法实际是 Executor 中声明的方法, ThreadPoolExecutor 进行了具体的实现...如果这个线程异常结束,会有另一取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。...,而是直接新建一线程来执行新来的任务。...setMaximumPoolSize:设置线程池最大创建的线程数目大小 当上述参数从小变大时,ThreadPoolExecutor 进行线程赋值,还可能立即创建新的线程来执行任务

36730

Java的Executor框架和线程池实现原理

shutdown(); /** * 从语义可以看出是立即停止的意思,暂停所有等待处理的任务并返回这些任务的列表 */ List...):当提交一任务线程池时,线程会创建一线程来执行任务,即使其他空闲的基本线程创建线程也会创建线程,等到到需要执行的任务数大于线程池基本大小corePoolSize时就不再创建 。...实际中,如果Executors提供的三静态方法满足要求,就尽量使用它提供的三方法,因为自己去手动配置ThreadPoolExecutor的参数有点麻烦,要根据实际任务的类型和数量来进行配置。...corePoolSize(即当前线程池中午运行的线程),则创建一新的线程来执行任务 2,当线程池中有一运行的线程时,任务加入阻塞队列 3,当线程完成任务时,会无限反复从链式阻塞队列中获取任务来执行...3、newSingleThreadExecutor创建一线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一取代它,保证顺序执行(我觉得这点是它的特色)。

38520

【Java线程】“打工人”初识线程池及自定义线程池实战

Java中万物皆对象,那么线程也是一对象,Java线程是对于操作系统线程的封装,创建Java线程也需要消耗操作系统的资源,因此就有了线程池。 原理 线程池创建 首先了解一下线程池创建以及工作原理。...,但是当前线程数小于最大线程数(maximumPoolSize),线程池会在核心线程的基础继续创建线程(非核心线程)执行任务; 4->当任务继续增加时,线程池的线程数达到最大线程数;如果任务继续增加...所执行任务是否需要数据库连接这样的稀缺资源? CPU密集型任务:说明包含了大量的运算操作,比如有NCPU,那么就配置线程池的容量大小为N+1,这样获得最优的利用率。...此外,如果CPU密集型任务使得CPU使用率很高,若开过多的线程数,会造成CPU过度切换。 IO密集任务:说明CPU大部分时间都是等待IO的阻塞操作,那么此时就可以线程池的容量大小配置的大一些。...这个线程池只有一线程工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一新的线程来替代它。此线程保证所有任务的执行顺序按照任务的提交顺序执行。 ?

58640

图文详解 Java线程

3、线程池流程 1、判断线程池中当前线程数是否大于核心线程数,如果小于,创建一新的线程来执行任务; 如果大于转2; 2、判断任务队列是否已满,没满则将新提交的任务添加在工作队列,已满则转3。...混合型任务 可以任务分成IO密集型和CPU密集型任务,然后分别用不同的线程池去处理。 只要分完之后两任务的执行时间相差不大,那么就会比串行执行来的高效。...(保证线程数可控,不会造成线程过多,导致系统负载更为严重) 3、newSingleThreadExecutor:创建一线程线程池,适用于需要保证顺序执行各个任务。...2、submit(),提交一线程任务,有返回值。 submit(Callable task)获取到它的返回值,通过future.get()获取(阻塞直到任务执行完)。...workerCount:工作线程的数量 ThreadPoolExecutor 中定义了一 volatile 变量,另外定义了几个 static final 变量表示线程池的各个状态: volatile

56120

线程池应用及实现原理剖析

为什么使用线程池?线程池是不是越多越好? ---- 线程 java 中是一对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间>执行任务时间就很不合算了。...线程池原理 - 概念 ---- 线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务。 工作线程线程池中线程没有任务时处于等待状态,可以循环地执行任务。...该线程池确保任务按加入的顺序一依次执行。当唯一的线程任务异常中止时,创建一新的线程来继续执行后续的任务。...newScheduledThreadPool(int corePoolSize) 定时执行任务线程池。该池的核心线程数由参数指定,最大线程数=Integer.MAX_VALUE。 6....,因为它不会为队列中元素维护存储空间,与其他队列不同的是,它维护一组线程,这些线程等待着把元素加入或移出队列 使用 SynchronousQueue 作为工作队列的前提下,客户端代码向线程池提交任务

21320

这些并发编程知识,一定要知道

线程池中的线程执行任务分两种情况,如下。 1)execute()方法中创建一线程时,会让这个线程执行当前任务。...由于countDown方法可以用在任何地方,所以这里说的N点,可以是N线程,也可以是1线程里的N执行步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里即可。...ConcurrentHashMap:HashTable的基础,对不同数据段的数据进行锁住,即使用锁分段技术。数据分成一段一段地存储起来,给每一段数据配一把锁。...锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。 锁的最终释放。线程重复n次获取了锁,随后n次释放该锁后,其他线程能够获取到该锁。...对象查询到绑定在这个线程的一值。

22220
领券