- 浏览: 950971 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
线程池多余任务的拒绝执行策略有四中,分别是直接丢弃任务DiscardPolicy,
丢弃old线程任务DiscardOldestPolicy,抛出异常AbortPolicy和调用线程执行多余任务CallerRunsPolicy,
下面我们用一个实例来测试一下这几种策略:
测试实例:
分别使用四中多余任务执行策略,
直接丢弃任务DiscardPolicy:
控制台输出:多余任务直接丢弃
time:1490366101248 -> ==========before sleep
time:1490366101248 -> run task:0 -> pool-1-thread-1
time:1490366102250 -> run over:0 -> pool-1-thread-1
time:1490366102250 -> run task:1 -> pool-1-thread-1
time:1490366103251 -> run over:1 -> pool-1-thread-1
time:1490366105250 -> ==========before shutdown()
time:1490366105251 -> ==========after shutdown(),pool.isTerminated=false
time:1490366105253 -> ==========now,pool.isTerminated=true
丢弃old线程任务DiscardOldestPolicy:
控制台输出:直接丢弃旧的任务
time:1490366209872 -> run task:0 -> pool-1-thread-1
time:1490366209872 -> ==========before sleep
time:1490366210872 -> run over:0 -> pool-1-thread-1
time:1490366210872 -> run task:9 -> pool-1-thread-1
time:1490366211875 -> run over:9 -> pool-1-thread-1
time:1490366213872 -> ==========before shutdown()
time:1490366213873 -> ==========after shutdown(),pool.isTerminated=false
time:1490366213874 -> ==========now,pool.isTerminated=true
抛出异常:AbortPolicy
控制台输出:抛出异常
time:1490366258974 -> run task:0 -> pool-1-thread-1Exception in thread "main"
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@3639b3a2 rejected from java.util.concurrent.ThreadPoolExecutor@684be8b8[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
at juc.executor.TestRejectedExecutionHandler.main(TestRejectedExecutionHandler.java:36)
time:1490366259974 -> run over:0 -> pool-1-thread-1
time:1490366259974 -> run task:1 -> pool-1-thread-1
time:1490366260976 -> run over:1 -> pool-1-thread-1
调用线程执行多余任务:CallerRunsPolicy
控制台输出:调用线程执行多余任务
time:1490366322359 -> run task:0 -> pool-1-thread-1
time:1490366322359 -> run task:2 -> main
time:1490366323360 -> run over:0 -> pool-1-thread-1
time:1490366323360 -> run over:2 -> main
time:1490366323360 -> run task:1 -> pool-1-thread-1
time:1490366323360 -> run task:4 -> main
time:1490366324361 -> run over:4 -> main
time:1490366324361 -> run over:1 -> pool-1-thread-1
time:1490366324361 -> run task:5 -> main
time:1490366324361 -> run task:3 -> pool-1-thread-1
time:1490366325362 -> run over:5 -> main
time:1490366325362 -> run task:7 -> main
time:1490366325363 -> run over:3 -> pool-1-thread-1
time:1490366325363 -> run task:6 -> pool-1-thread-1
time:1490366326363 -> run over:7 -> main
time:1490366326363 -> run over:6 -> pool-1-thread-1
time:1490366326363 -> run task:8 -> pool-1-thread-1
time:1490366326363 -> run task:9 -> main
time:1490366327365 -> run over:9 -> main
time:1490366327365 -> run over:8 -> pool-1-thread-1
time:1490366327365 -> ==========before sleep
time:1490366331366 -> ==========before shutdown()
time:1490366331367 -> ==========after shutdown(),pool.isTerminated=false
time:1490366331367 -> ==========now,pool.isTerminated=true
丢弃old线程任务DiscardOldestPolicy,抛出异常AbortPolicy和调用线程执行多余任务CallerRunsPolicy,
下面我们用一个实例来测试一下这几种策略:
测试实例:
package juc.executor; import java.lang.reflect.Field; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor.AbortPolicy; import java.util.concurrent.TimeUnit; /** * 测试线程池拒绝执行任务策略 * * @author donald 2017年3月24日 上午8:56:07 */ public class TestRejectedExecutionHandler { /** * * @param msg */ static void log(String msg) { System.out.println("time:"+System.currentTimeMillis() + " -> " + msg); } public static void main(String[] args) throws Exception { ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1)); //直接丢弃任务 pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); //丢弃old线程任务 // pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy()); //抛出异常 // pool.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); //调用线程执行多余任务 // pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 0; i < 10; i++) { final int index = i; pool.submit(new Runnable() { public void run() { log("run task:" + index + " -> " + Thread.currentThread().getName()); try { Thread.sleep(1000L); } catch (Exception e) { e.printStackTrace(); } log("run over:" + index + " -> " + Thread.currentThread().getName()); } }); } log("==========before sleep"); Thread.sleep(4000L); log("==========before shutdown()"); pool.shutdown(); log("==========after shutdown(),pool.isTerminated=" + pool.isTerminated()); pool.awaitTermination(1000L, TimeUnit.SECONDS); log("==========now,pool.isTerminated=" + pool.isTerminated()); } }
分别使用四中多余任务执行策略,
直接丢弃任务DiscardPolicy:
控制台输出:多余任务直接丢弃
time:1490366101248 -> ==========before sleep
time:1490366101248 -> run task:0 -> pool-1-thread-1
time:1490366102250 -> run over:0 -> pool-1-thread-1
time:1490366102250 -> run task:1 -> pool-1-thread-1
time:1490366103251 -> run over:1 -> pool-1-thread-1
time:1490366105250 -> ==========before shutdown()
time:1490366105251 -> ==========after shutdown(),pool.isTerminated=false
time:1490366105253 -> ==========now,pool.isTerminated=true
丢弃old线程任务DiscardOldestPolicy:
控制台输出:直接丢弃旧的任务
time:1490366209872 -> run task:0 -> pool-1-thread-1
time:1490366209872 -> ==========before sleep
time:1490366210872 -> run over:0 -> pool-1-thread-1
time:1490366210872 -> run task:9 -> pool-1-thread-1
time:1490366211875 -> run over:9 -> pool-1-thread-1
time:1490366213872 -> ==========before shutdown()
time:1490366213873 -> ==========after shutdown(),pool.isTerminated=false
time:1490366213874 -> ==========now,pool.isTerminated=true
抛出异常:AbortPolicy
控制台输出:抛出异常
time:1490366258974 -> run task:0 -> pool-1-thread-1Exception in thread "main"
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@3639b3a2 rejected from java.util.concurrent.ThreadPoolExecutor@684be8b8[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
at juc.executor.TestRejectedExecutionHandler.main(TestRejectedExecutionHandler.java:36)
time:1490366259974 -> run over:0 -> pool-1-thread-1
time:1490366259974 -> run task:1 -> pool-1-thread-1
time:1490366260976 -> run over:1 -> pool-1-thread-1
调用线程执行多余任务:CallerRunsPolicy
控制台输出:调用线程执行多余任务
time:1490366322359 -> run task:0 -> pool-1-thread-1
time:1490366322359 -> run task:2 -> main
time:1490366323360 -> run over:0 -> pool-1-thread-1
time:1490366323360 -> run over:2 -> main
time:1490366323360 -> run task:1 -> pool-1-thread-1
time:1490366323360 -> run task:4 -> main
time:1490366324361 -> run over:4 -> main
time:1490366324361 -> run over:1 -> pool-1-thread-1
time:1490366324361 -> run task:5 -> main
time:1490366324361 -> run task:3 -> pool-1-thread-1
time:1490366325362 -> run over:5 -> main
time:1490366325362 -> run task:7 -> main
time:1490366325363 -> run over:3 -> pool-1-thread-1
time:1490366325363 -> run task:6 -> pool-1-thread-1
time:1490366326363 -> run over:7 -> main
time:1490366326363 -> run over:6 -> pool-1-thread-1
time:1490366326363 -> run task:8 -> pool-1-thread-1
time:1490366326363 -> run task:9 -> main
time:1490366327365 -> run over:9 -> main
time:1490366327365 -> run over:8 -> pool-1-thread-1
time:1490366327365 -> ==========before sleep
time:1490366331366 -> ==========before shutdown()
time:1490366331367 -> ==========after shutdown(),pool.isTerminated=false
time:1490366331367 -> ==========now,pool.isTerminated=true
发表评论
-
Executors解析
2017-04-07 14:38 1199ThreadPoolExecutor解析一(核心线程池数量、线 ... -
ScheduledThreadPoolExecutor解析三(关闭线程池)
2017-04-06 20:52 4403ScheduledThreadPoolExecutor解析一( ... -
ScheduledThreadPoolExecutor解析二(任务调度)
2017-04-06 12:56 2071ScheduledThreadPoolExecutor解析一( ... -
ScheduledThreadPoolExecutor解析一(调度任务,任务队列)
2017-04-04 22:59 4911Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析四(线程池关闭)
2017-04-03 23:02 9027Executor接口的定义:http: ... -
ThreadPoolExecutor解析三(线程池执行提交任务)
2017-04-03 12:06 6023Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析二(线程工厂、工作线程,拒绝策略等)
2017-04-01 17:12 2984Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析一(核心线程池数量、线程池状态等)
2017-03-31 22:01 20461Executor接口的定义:http://donald-dra ... -
ScheduledExecutorService接口定义
2017-03-29 12:53 1445Executor接口的定义:http://donald-dra ... -
AbstractExecutorService解析
2017-03-29 08:27 1011Executor接口的定义:http: ... -
ExecutorCompletionService解析
2017-03-28 14:27 1515Executor接口的定义:http://donald-dra ... -
CompletionService接口定义
2017-03-28 12:39 999Executor接口的定义:http://donald-dra ... -
FutureTask解析
2017-03-27 12:59 1271package java.util.concurrent; ... -
Future接口定义
2017-03-26 09:40 1125/* * Written by Doug Lea with ... -
ExecutorService接口定义
2017-03-25 22:14 1108Executor接口的定义:http://donald-dra ... -
Executor接口的定义
2017-03-24 23:24 1591package java.util.concurrent; ... -
JAVA集合类简单综述
2017-03-23 22:51 870Queue接口定义:http://donald-draper. ... -
DelayQueue解析
2017-03-23 11:00 1674Queue接口定义:http://donald-draper. ... -
SynchronousQueue解析下-TransferQueue
2017-03-22 22:20 2084Queue接口定义:http://donald-draper. ... -
SynchronousQueue解析上-TransferStack
2017-03-21 22:08 3004Queue接口定义:http://donald-draper. ...
相关推荐
Android中的线程池与任务队列
线程池示例(包含自定义拒绝策略),演示了如何创建一个线程池,以及添加到队列的过程,先添加到工作线程,然后是缓存队列,最后是创建临时线程
带任务描述及执行时间的线程池执行框架, 使用Java 编写, 可以方便地完成多线程任务
线程池详解:线程池七大核心参数、线程池工作原理、线程池的创建方式、线程池的拒绝策略、如何合理分配线程池大小 文件内容包括pdf文件和思维导图
AppExecutor 应用线程池,可以指定任务的优先级,以及任务执行顺序
主要介绍了Java线程池的拒绝策略实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池...
Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等... ConcurrentLinkedQueue、DelayQueue示例、自定义的线程拒绝策略、自定义线程池(使用有界队列)、自定义线程池(使用无界队列)。。。
3.任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。 4.任务队列:用于存放没有处理的任务。提供一种缓冲机制。 网上的c/c++线程池多是linux下的,这个是VC6.0的线程池。其涉及的主要文件有:...
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 线程池的优势 (1)、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;(2)、提高系统响应速度,当...
线程池的任务就在于负责这些线程的创建,销毁和任务处理参数传递、唤醒和等待。1、创建若干线程,置入...5、如果创建失败或者线程池已满,根据设计策略选择返回错误或将任务置入处理队列,等待处理。6. 销毁线程池。
线程池提交优先级,执行优先级
阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池...
SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕 static final int STOP = 2;停止状态;此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务 static final int TERMINATED = 3;终止...
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
java代码 ThreadPoolExecutor线程池并发测试例子如有误欢迎指正
c语言线程池用于多任务处理减少内存开销
这段代码实现了一个简单的线程池ExecutorService,其中使用了Java的匿名内部类。...这个简单的示例代码展示了如何使用Java匿名内部类来实现一个线程池的简单功能,方便了对多线程任务的管理和执行。
实现了一个线程池。其中运用了队列,以避免任务丢失。在队列和线程池之间创建了一个中间夹层,以提高可移植性。当任务来时,先压入队列,然后...线程完成任务后,再去队列查询,如果有任务就去执行,没有则阻塞,等待
springboot整合web常用技术,包括mybatis、定时任务quartz、线程池、访问日志、aop等等技术