package com.aaa.threaddemo;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy; /*
一 常见线程池之
* newCachedThreadDemo
* 1 可以根据需要创建新的线程的线程池
* 2 旧的线程可用时,将重用他们。 第一个任务完成,第二个任务会复用第一个线程,不会新建线程
* 3 当旧的线程不可用时,才会创建新的线程。 终止并且从缓存中移除 60秒未使用的线程
* 4 所有该线程就算长时间保持空闲,也不会使用任何资源
* 5 任何任务来了就能执行,不需要等待
*
* 场景?
* 对于执行 许多短期异步的程序。
* 大量,耗时少的任务
* 可以提高效率
*
二 真实的 newCacheThreadPool()
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(
0, //核心线程数量 0
Integer.MAX_VALUE, //最大线程数量时Integer型的最大值,是2147483647。
60L, //非核心线程生存时间 60秒
TimeUnit.SECONDS, //空闲时间单位 秒
new SynchronousQueue<Runnable>()); //等待队列 SynchronousQueue
} 三 SynchronousQueue 队列是个啥?
1.是阻塞队列 BlockingQueue 的一种,所以线程上是安全的
2.SynchronousQueue的容量是0,不存储任何元素
3.更是在线程之间移交任务 在两个线程之间传递同一个对象
当有item 来的时候, insert操作。需要等待其他线程来接收。其他线程做remove操作。
当删除 item, remove操作,也是一样的。 四 拒绝策略 默认的 AbortPolicy。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
} private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();
和它相关的任务 都不执行 线程池默认的拒绝方式
*
*/
public class CachedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService cachePool = Executors.newCachedThreadPool(); //创建可以缓存的线程池 //来6个线程试一下
CacheThread cacheThread = new CacheThread();
CacheThread cacheThread2 = new CacheThread();
CacheThread cacheThread3 = new CacheThread();
CacheThread cacheThread4 = new CacheThread();
CacheThread cacheThread5 = new CacheThread();
CacheThread cacheThread6 = new CacheThread(); cachePool.execute(cacheThread);
cachePool.execute(cacheThread2);
cachePool.execute(cacheThread3);
cachePool.execute(cacheThread4);
cachePool.execute(cacheThread5);
cachePool.execute(cacheThread6); Runnable task = new Runnable() {
public void run() {
System.out.println("new 一个 runnable接口, 实现多线程");
System.out.println("当前执行线程的名字" + Thread.currentThread().getName());
}
}; cachePool.execute(task); //线程池中执行任务 cachePool.shutdown(); //渐进式的关闭线程池
}
} class CacheThread extends Thread{
@Override
public void run() {
System.out.println("当前执行线程的名字" + Thread.currentThread().getName());
}
}

看下结果

让线程睡一会

最新文章

  1. 为什么DOM操作很慢
  2. jq倒计时(代码)
  3. Windows 安装 openssl
  4. React.js 是什么?
  5. javascript小练习—函数接收参数并弹出
  6. Aspx 页面生命周期
  7. cocos2d-x-lua基础系列教程三(lua面向对象)
  8. JavaEE:Eclipse开发工具的相关使用和XML技术
  9. sipcal
  10. android usb挂载分析
  11. Python初识--基础
  12. 如何配置springboot一访问服务器本地图片
  13. .net momeryStream 读取为空问题
  14. Vue组件的使用
  15. Linq分组查询统计
  16. NTFS的交换数据流ADS应用
  17. flume-ng-sql-source实现oracle增量数据读取
  18. day08-MySQl创建用户和授权
  19. JavaScript学习总结(七)——JavaScript函数(function)
  20. NOIP2015普及组T4推销员(暴力+线段树)

热门文章

  1. Revolving Digits(hdu4333)
  2. Wiener Filtering
  3. [opencv]Rect集合象限法分类聚合 函数
  4. CS5211替代CH7511B|设计DP转LVDS转接板|替代CH7511B
  5. Vue.js高效前端开发 • 【Vue基本指令】
  6. Log4j2完整XML参考(详细注释说明)
  7. [学习笔记] IT项目管理 - 挣值管理(EVM)
  8. Pytest_在jenkins中使用allure报告(13)
  9. minio实现文件上传下载和删除功能
  10. java 使用 ArrayList 排序【包括数字和字符串】