1.ThreadPoolExecutor =>
线程池在启动后,不管有没有任务来时,就会先创建coreSize个线程数。
(1)、使用有界队列(ArrayBlockingQueue):=>maxPoolSize和队列大小需要平衡。
当要执行的任务数小于coreSize时,就用coreSize个线程执行任务,
当任务数等于coreSize的大小时,新来一个任务,则首先将任务放入队列中,以此类推,直到队列满;
当队列满时,再新来一个任务,则新开一个线程,以此类推,直到达到线程池的最大值。
当队列满并且最大线程数到达时,再新来一个任务,执行拒绝策略。
/////////begin//////
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 25, 1000, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(70),new ThreadPoolExecutor.CallerRunsPolicy());
////////end/////////
(2)、使用无界队列(LinkedBlockingQueue):=>maxPoolSize失效
当要执行的任务数小于coreSize时,就用coreSize个线程执行任务,
当任务数等于coreSize的大小时,新来一个任务,则新开一个线程,以此类推,直到队列满(如果队列的size无限大,则不会满)。
/////////begin///////
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 25, 1000, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(Integer.MAX_VALUE),new ThreadPoolExecutor.CallerRunsPolicy());
/////////end/////////
(3)、使用直接提交(SynchronousQueue):=>
当有任务来时,总是开启新线程来执行任务。因此,建议maxPoolSize要足够大,否则会丢弃任务。
////////begin////////
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 20, 1000, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>(),new ThreadPoolExecutor.CallerRunsPolicy());
//////////end////////
结论:使用有界队列和CallerRunsPolicy 保证线程池的可伸缩性。比如:
////////begin///////
private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 30, 1000, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(10),new ThreadPoolExecutor.CallerRunsPolicy());
///////////end//////
注意:【jdk线程池的bug】目前jdk6及之前的版本有bug,需要使用jdk7之后的版本。参见:
【http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662】
注意:CallerRunsPolicy策略
==>A handler for rejected tasks that runs the rejected task directly in the calling thread of the execute method
关于【CallerRunsPolicy】,如果线程main中调用了线程池方法,如:executor.submit()或者executor.execute(),那么当线程池以最大线程在运行并且排队队列也变满时,
此时再进来一个任务的情况下,该任务就执行CallerRunsPolicy策略的语义(字面义也是调用者运行的意思),即让调用线程池的调用者来运行该任务,当此任务执行时间比较长时,会出现
线程池中的线程已空闲,但是调用者线程还没有执行完长任务时,再来新任务就不会被加入线程池中,直到调用者线程执行完毕。
分享到:
相关推荐
JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程编程的效率和灵活性。本文将详细介绍 JDK 自带线程池的组成、创建方法、优点和常见应用场景。 多线程技术 多线程技术是指在一个处理器单元...
而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,...
JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介
jdk自带的线程池是Java开发中一个非常重要的概念,特别是在多线程编程中。线程池是线程的容器,每次只执行额定数量的线程,线程池就是用来管理这些额定数量的线程。下面我们来详细了解jdk自带的线程池。 一、jdk...
在Java并发编程中,线程池(ThreadPoolExecutor)是一个至关重要的工具,它允许开发者有效地管理线程资源,提高系统的性能和响应性。JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程...
JDK1.5中的线程池(ThreadPoolExecutor)使用简介
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的...
JDK线程池可以通过ThreadPoolExecutor类来创建,ThreadPoolExecutor类提供了一个ExecutorService接口的实现。 在使用JDK线程池时,我们可以通过ThreadPoolExecutor类来创建一个线程池,例如: ```java private ...
本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、接口设计以及异常处理。 首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
ThreadPoolExecutor作为Java中的线程池实现,其内部机制相当复杂且灵活。本文将深入解析ThreadPoolExecutor的execute()方法执行流程,以帮助我们理解线程池的工作原理。 当一个任务被提交到线程池,线程池的执行...
在Java编程语言中,线程并发和线程池是多任务执行的核心概念,尤其是在JDK 1.5及以后的版本中得到了显著增强。线程并发允许程序同时执行多个任务,提高了程序的效率和响应性。线程池是管理线程资源的有效方式,通过...
在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,其中包含了一系列关于线程池的接口和类,极大地丰富了线程池的应用场景和管理方式。 线程池的主要作用是限制系统...
3:对线程池的基本使用及其部分源码的分析(注意:这里的源码分析是基于jdk1.6;) a:线程池的状态 volatile int runState; static final int RUNNING = 0; 运行状态 static final int SHUTDOWN = 1; 关闭状态;...
线程池在Java中是通过`java.util.concurrent`包下的`ThreadPoolExecutor`类实现的。 线程池的主要作用是限制系统中执行线程的数量,通过预先配置好的线程数量,可以避免过多线程导致的资源浪费和系统拥挤,从而提高...
Java中,线程池是通过java.util.concurrent.ThreadPoolExecutor类实现的,它为Java应用程序提供了一种有效地管理线程资源的方式。从JDK 1.5开始,Java并发API得到了增强,提供了更为强大的并发工具和库,其中就包括...
在早期的JDK版本(如JDK 1.4及之前)中,线程池的功能相对简单,使用起来不够灵活。然而,自JDK 1.5开始,随着`java.util.concurrent`包的引入,Java线程池的功能得到了极大的增强,为开发者提供了更加高效且易于...
21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类总结 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier 26....
`MonitorableThreadPoolExecutor` 类是基于 JDK 的 `ThreadPoolExecutor` 进行扩展,增加了监控功能,使得开发者可以更好地了解线程池的运行状态,并对异常情况进行及时处理。 `MonitorableThreadPoolExecutor` 类...