TestThreadPoolExecutorMain

package core.test.threadpool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* ThreadPoolExecutor 线程池
* 构造函数参数
*
* 1、corePoolSize 核心线程数大小,当线程数 < corePoolSize ,会创建线程执行 runnable
*
* 2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把 runnable 放入 workQueue中
*
* 3、keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
*
* 4、unit 时间单位
*
* 5、workQueue 保存任务的阻塞队列
*
* 6、threadFactory 创建线程的工厂
*
* 7、handler 拒绝策略
*
* 任务执行顺序 (核心线程数,阻塞队列,最大线程数,异常)
*
* 1、当线程数小于 corePoolSize时,创建线程执行任务。
*
* 2、当线程数大于等于 corePoolSize并且 workQueue 没有满时,放入workQueue中
*
* 3、线程数大于等于 corePoolSize并且当 workQueue 满时,新任务新建线程运行,线程总数要小于 maximumPoolSize
*
* 4、当线程总数等于 maximumPoolSize 并且 workQueue 满了的时候执行 handler 的
* rejectedExecution。也就是拒绝策略。
*
* 四个拒绝策略
*
* ThreadPoolExecutor默认有四个拒绝策略:
*
* 1、ThreadPoolExecutor.AbortPolicy() 直接抛出异常RejectedExecutionException
*
* 2、ThreadPoolExecutor.CallerRunsPolicy() 直接调用run方法并且阻塞执行
*
* 3、ThreadPoolExecutor.DiscardPolicy() 直接丢弃后来的任务
*
* 4、ThreadPoolExecutor.DiscardOldestPolicy() 丢弃在队列中队首的任务
*
* 当然可以自己继承RejectedExecutionHandler来写拒绝策略.
*
* @author chenyd 2017年10月24日
*/
public class TestThreadPoolExecutor {
public static void main(String[] args) {
Long currentTimeMillis = System.currentTimeMillis();
// new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
// unit, workQueue)
ThreadPoolExecutor threadpool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3)); for (int i = 0; i < 100; i++) { try {
String task = "task=" + i;
System.out.println("创建任务并提交到线程池:" + task);
threadpool.execute(new ThreadPoolTast(task)); Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
} } try {
threadpool.shutdown();
boolean loop = true; do {
loop = !threadpool.awaitTermination(2, TimeUnit.SECONDS);
} while (loop); if (loop != true) {
System.out.println("所有线程执行完毕");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("耗时:" + (System.currentTimeMillis() - currentTimeMillis));
} }
}

ThreadPoolTast

package core.test.threadpool;

import java.io.Serializable;

public class ThreadPoolTast implements Runnable, Serializable {

    /**
*
*/
private static final long serialVersionUID = 1L; private Object attachData; public ThreadPoolTast(Object tasks) {
this.attachData=tasks;
} @Override
public void run() { try {
System.out.println("开始执行任务:"+attachData+"任务,使用线程池,线程名称:"+Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
} attachData=null; }
}

参考链接:

Java四种线程池的使用 http://cuisuqiang.iteye.com/blog/2019372

最新文章

  1. 第 1 章 jQuery EasyUI 入门
  2. 项目:学生查看自己的作业情况和分数(php)
  3. [原]ComFriendlyWaitMtaThreadProc
  4. DOM操作基础
  5. Android组件系列----ContentProvider内容提供者
  6. Writable、WritableComparable和comparators
  7. win7防火墙打不开(无法启动windows firewall服务)
  8. java中的异常结构
  9. 异步化DAO的设计和实践
  10. OpenCV学习 5:关于平滑滤波器 cvSmooth()函数
  11. javascript操作HTML元素
  12. Qt学习之路(49): 通用算法
  13. 配置Meld为git的默认比较工具
  14. Variant does not reference an auomation object
  15. (转载)python调用shell命令之os 、commands、subprocess
  16. Dockerfile指令详解
  17. php 求余
  18. github提交代码后没有contribution问题
  19. python 递增递减数列
  20. LOJ#162. 快速幂 2(分块)

热门文章

  1. adb 连接时候不弹出授权对话框【转】
  2. Jackson 对象与json数据互转工具类JacksonUtil
  3. 启动tomcat时,经常遇到的问题 8080 端口被占用
  4. LA-4356&amp;&amp;hdu-2469 (极角排序+扫描线)
  5. (转)Vim自动补全神器:YouCompleteMe
  6. 【扬中集训Day6T1】 白日梦
  7. CClientDC类 CWindowDC类
  8. cocos2d-x 坐标系解惑
  9. Collection View Programming Guide for iOS---(四)---Using the Flow Layout
  10. Codeforces510B【dfs】