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());
}
}

看下结果

让线程睡一会

常见线程池之 newCacheThreadPool 缓存线程池 简单使用的更多相关文章

  1. 8、java5线程池之动态缓存线程池newCachedThreadPool

    JDK文档描述 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能.调用 execute 将重用以前构造的线程 ...

  2. 阿里开源支持缓存线程池的ThreadLocal Transmittable ThreadLocal(TTL)

    功能 在使用线程池等会缓存线程的组件情况下,提供ThreadLocal值的传递功能. JDK的InheritableThreadLocal类可以完成父子线程值的传递. 但对于使用线程池等会缓存线程的组 ...

  3. Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解.[size=1.8em]Handler+Runna ...

  4. 【转】Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    http://www.cnblogs.com/wanqieddy/archive/2013/09/06/3305482.html android线程池的理解,晚上在家无事 预习了一下android异步 ...

  5. 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  6. [Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  7. (CSDN 迁移) JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)

    在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).下面介绍的是第三种newCachedThreadPo ...

  8. cachedThreadPool缓存线程池

    package com.loan.modules.common.util; import java.util.concurrent.BlockingQueue; import java.util.co ...

  9. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

随机推荐

  1. 【剑指Offer】10- I. 斐波那契数列 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 递归 动态规划 日期 题目地址:htt ...

  2. Elasticsearch核心技术(五):搜索API和搜索运行机制

    本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...

  3. 【环境搭建】安装pyQt5 在pycharm报This application failed to start because no Qt platform plugin could be initialized的问题

    报错:This application failed to start because no Qt platform plugin could be initialized 解决办法: http:// ...

  4. CS5263|DP转HDMI转换器芯片|CS5263芯片说明

    CS5263是一款高性能DP1.4到HDMI2.0b功能芯片,设计用于将DP1.4源连接到HDMI2.0b接收器.CS5263集成了DP1.4兼容接收机和HDMI2.0b兼容接收机发射器.DP接口包括 ...

  5. 从零开始学springboot-1.创建项目

    新建一个项目 添加依赖 点击完成,项目结构如下 手动添加以下依赖 打开pom.xml文件,手动添加以下依赖,用于自动生成代码 <dependency> <groupId>com ...

  6. 在CentOS7系统安装与配置RabbitMQ

    在CentOS7系统安装与配置RabbitMQ 远程访问需要开放端口 https://www.cnblogs.com/heqiuyong/p/10460150.html

  7. docker部署logstash

    1.下载镜像 [root@vanje-dev01 ~]# docker pull logstash:7.0.1 2.安装部署 2.1  创建宿主映射目录 # mkdir /etc/logstash/ ...

  8. react中实现css动画

  9. Linux系统管理学习实训任务书

    1.<Linux系统管理实训任务一之搭建实验基础环境> https://www.toutiao.com/i6763578305091207694/ 2.<Linux系统管理实训任务一 ...

  10. .gitignore文件编写规则

    1.gitignore说明 在使用git的过程中,一般我们总会有些文件无需纳入git的管理,也不希望它们总出现在未跟踪文件列表,这些文件通常是日志文件.临时文件.编译产生的中间文件.工具自动生成的文件 ...