-
ThreadPoolExecutor.AbortPolicy()抛出java.util.concurrent.RejectedExecutionException异常 终止策略是默认的饱和策略;
-
ThreadPoolExecutor.CallerRunsPolicy()当抛出RejectedExecutionException异常时,会调rejectedExecution方法 调用者运行策略实现了一种调节机制,该策略既不会抛弃任务也不会爆出异常,而是将任务退回给调用者,从而降低新任务的流量
- ThreadPoolExecutor.DiscardOldestPolicy()抛弃旧的任务;当新提交的任务无法保存到队列中等待执行时将抛弃最旧的任务,然后尝试提交新任务。如果等待队列是一个优先级队列,抛弃最旧的策略将导致抛弃优先级最高的任务,因此AbortPolicy最好不要和优先级队列一起使用。
- ThreadPoolExecutor.DiscardPolicy()抛弃当前的任务
/** *返回给调用者的饱和策略 * @author zhangwei_david * @version $Id: CallerRunsTestClient.java, v 0.1 2014年11月13日 下午3:14:58 zhangwei_david Exp $ */ public class CallerRunsTestClient { /** * * @param args */ public static void main(String[] args) { //等待队列 final LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(5); ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 2, TimeUnit.SECONDS, queue); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); for (int i = 0; i < 15; i++) { executor.execute(new Runnable() { public void run() { System.out.println("run-" + Thread.currentThread().getName() + " queue:" + queue.size()); try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { //logger.error("", e); } } }); } } }
运行的结果是:可以在日志中看有两次是在主线程中运行的
run-pool-1-thread-1 queue:5 run-pool-1-thread-2 queue:5 run-pool-1-thread-3 queue:5 run-main queue:5 run-pool-1-thread-4 queue:5 run-pool-1-thread-5 queue:5 run-pool-1-thread-1 queue:4 run-pool-1-thread-3 queue:2 run-pool-1-thread-2 queue:3 run-main queue:5 run-pool-1-thread-5 queue:4 run-pool-1-thread-4 queue:3 run-pool-1-thread-2 queue:1 run-pool-1-thread-1 queue:1 run-pool-1-thread-3 queue:0
终止饱和策略是,当提交的任务无法进入等待队列且线程池中创建的线程数量已经达到了最大线程数量的限制,则会拒绝新提交的任务。
/** *终止饱和策略 * @author zhangwei_david * @version $Id: AbortTestClient.java, v 0.1 2014年11月13日 下午3:03:47 zhangwei_david Exp $ */ public class AbortTestClient { public static void main(String[] args) { final ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(5)); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); executor.setThreadFactory(new MyThreadFactory("Test")); for (int i = 0; i < 10; i++) { try { executor.execute(new Runnable() { public void run() { //doNothing } }); } catch (RejectedExecutionException e) { System.out.println("第" + i + "次提交线程被拒绝! 当前活动线程数:" + executor.getActiveCount() + " 队列长度:" + executor.getQueue().size()); } } } }
运行的结果:
第8次提交线程被拒绝! 当前活动线程数:3 队列长度:5 第9次提交线程被拒绝! 当前活动线程数:3 队列长度:5 一月 21, 2015 9:11:03 下午 com.cathy.demo.concurrency.executor.threadFactory.MyAppThread run 信息: Created Test-2 一月 21, 2015 9:11:03 下午 com.cathy.demo.concurrency.executor.threadFactory.MyAppThread run 信息: Created Test-1 一月 21, 2015 9:11:03 下午 com.cathy.demo.concurrency.executor.threadFactory.MyAppThread run 信息: Created Test-3 一月 21, 2015 9:11:05 下午 com.cathy.demo.concurrency.executor.threadFactory.MyAppThread run 信息: Exiting Test-3 一月 21, 2015 9:11:05 下午 com.cathy.demo.concurrency.executor.threadFactory.MyAppThread run 信息: Exiting Test-1
DiscardPolicy 是抛弃当前任务
/** * * @author zhangwei_david * @version $Id: DiscardTestClient.java, v 0.1 2014年11月13日 下午3:16:28 zhangwei_david Exp $ */ public class DiscardTestClient { /** * * @param args */ public static void main(String[] args) { final ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(5)); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); for (int i = 0; i < 10; i++) { System.out.println(MessageFormat.format("第{0}次提交任务,当前等待队列长度{1}", i, executor.getQueue() .size())); executor.execute(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { //logger.error("", e); } } }); } executor.shutdown(); } }运行结果是:
第0次提交任务,当前等待队列长度0 第1次提交任务,当前等待队列长度0 pool-1-thread-1 第2次提交任务,当前等待队列长度1 第3次提交任务,当前等待队列长度2 第4次提交任务,当前等待队列长度3 第5次提交任务,当前等待队列长度4 第6次提交任务,当前等待队列长度5 pool-1-thread-2 第7次提交任务,当前等待队列长度5 pool-1-thread-3 第8次提交任务,当前等待队列长度5 第9次提交任务,当前等待队列长度5 pool-1-thread-1 pool-1-thread-2 pool-1-thread-3 pool-1-thread-1 pool-1-thread-3通过结果可以发现,提交了10个任务最终只有8个任务被执行!其中有两次被抛弃了!
相关推荐
(转)线程池:java_util_ThreadPoolExecutor 比较详细的介绍了ThreadPoolExecutor用法与属性
17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 ...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
线程池的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,那么超出数量的线程排队等候,等其他线程执行完毕再从队列中取出任务来执行。...
线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 ...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util....
在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了...
死磕ThreadPoolExecutor线程池.pdf!!死磕ThreadPoolExecutor线程池.pdf死磕ThreadPoolExecutor线程池.pdf死磕ThreadPoolExecutor线程池.pdf
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run...
ThreadPoolExecutor源码解析.md
17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 ...
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 3:对线程池的基本使用及其部分源码的分析...
ThreadPoolExecutor源码解析.pdf
.....Java语言认识 ..........概述 ..........Java语言认识 ..........Java底层平台认识 .....JDK安装与配置 ..........安装JDK ..........设置环境变量 ..........虚拟机的内存 .....JDK工具使用 ..........javac....
先来看一下线程池的java模型 Executor:线程池顶级接口,只有一个方法 ExecutorService:真正的线程池接口 void execute(Runnable command) :执行任务/命令,没有返回值,一般用来执行Runnable Future submit...
一个关于java 线程池的例子,也适合android
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
主要介绍了java ThreadPoolExecutor使用方法简单介绍的相关资料,需要的朋友可以参考下