扫码关注公众号

java语言之JVM虚拟机-线程池
02-08
618观看
01

如果任务很多,线程池的阻塞队列会撑爆内存的哪个区域

当线程池处理的太慢的时候,队列里的内容会积累,积累到一定程度Java中数据的存储位置分为以下5种:寄存器:最快的存储区,位于处理器内部,但是数量极其有限。所以寄存器根据需求进行自动分配,无法直接人为控制。栈内存:位于RAM当中,通过堆栈指针可以从处理器获得直接支持。堆栈指针向下移动,则分配新的内存;向上移动,则释放那些内存。这种存储方式速度仅次于寄存器。常用于存放对象引用和基本数据类型,而不用于存储对象)堆内存:堆相对于栈的好处来说:编译器不需要知道存储的数据在堆里存活多长。当需要一个对象时,使用new写一行代码,当执行这行代码时,会自动在堆里进行存储分配。同时,因为以上原因,用堆进行数据的存储分配和清理,需要花费更多的时间。常量池:常量(字符串常量和基本类型常量)通常直接存储在程序代码内部(常量池)。这样做是安全的,因为它们的值在初始化时就已经被确定,并不会被改变。常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如Strings="java"这种申明方式非RAM存储区:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是:流对象和持久化对象。

来自:多线程和线程池-线程池
02

介绍线程池,不同线程池区别在哪,你平时怎么使用线程池的

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。Java通过Executors提供四种线程池1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。2、newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3、newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。4、newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级执行。newCachedThreadPool创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。newFixedThreadPool创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。newScheduledThreadPool创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。newSingleThreadExecutor创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。多线程处理数据。(线程A+线程B与线程C是并行,当A+B时间处理完成后,等待0.2s,获取C的返回值,一同结束,这样就缩短了程序的执行时间,可以使用线程的feature.get方法,带参数则等待参数的时常,超时抛出runtime,不带参数则一直等待取到结果)(可以用来做海量数据的处理,当我们要从kafka中截取大量字符并作筛选,这时就可以开多个线程同时处理,以免堆积)。

来自:多线程和线程池-线程池
03

为什么要有线程池(阿里面试题)

(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

来自:多线程和线程池-线程池
04

 线程池有哪几类?有什么区别?有哪些参数?拒绝策略有哪些(阿里面试题)

常用的JAVA线程池有以下几种类型:1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。这种类型的线程池特点是:工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger.MAX_VALUE),这样可灵活的往线程池中添加线程。如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统OOM。2、newFixedThreadPool创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。3、newSingleThreadExecutor创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。4、newScheduleThreadPool创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。5、newSingleThreadScheduledExecutor创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行并且可定时或者延迟执行线程活动。2七大参数intcorePoolSize,//核心线程池数intmaximumPoolSize,//最大核心线程池大小longkeepAliveTime,//超时释放TimeUnitunit,//超时单位BlockingQueueworkQueue,//阻塞队列ThreadFactorythreadFactory,//线程工厂RejectedExecutionHandlerhandler)//拒绝策略3四种拒绝策略newThreadPoolExecutor.AbortPolicy()//银行满了,还有人进来,不处理这个人的,抛出异常newThreadPoolExecutor.CallerRunsPolicy()//哪来的去哪里!newThreadPoolExecutor.DiscardPolicy()//队列满了,丢掉任务,不会抛出异常!newThreadPoolExecutor.DiscardOldestPolicy()//队列满了,尝试去和最早的竞争,也不会抛出异常!

来自:多线程和线程池-线程池
05

请回答一下Java中有几种线程池?并且详细描述一下线程池的实现过程

newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程newFixedThreadPool:创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。newSingleThreadExecutor:创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。newScheduleThreadPool:创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

来自:多线程和线程池-线程池
06

请列举一下启动线程有哪几种方式,之后再说明一下线程池的种类都有哪些?

要启动的可以分为两类:返回结果和不返回结果。对于这两种,也分别有两种启动线程的方式:1)继承Thread类,重载run()2)实现Runnable接口,实现run()3)实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的线程常用方法:1.newCachedThreadPool()2.newFixedThreadPool(intnThreads)3.newSingleThreadExecutor()4.newScheduleThreadPool()5.newWorkStealingPool(intparallelism)

来自:多线程和线程池-线程池
课程
专栏
java语言-多线程和线程池-线程池
4专栏
1课程
6 试题