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. 小白自制Linux开发板(第二季 V3s篇) 一. 换个核心再来一次

    1.前言 大家心心念念(个人认为)的小白自制开发板全新系列正式来了,之前我们使用全志的F1C200s芯片制作了一个小电脑,众所周知,调试很艰难,坑也很多,以至于墨云到现在还是没找到对应的补救方案,为了 ...

  2. Exploring Architectural Ingredients of Adversarially Robust Deep Neural Networks

    目录 概 主要内容 深度 宽度 代码 Huang H., Wang Y., Erfani S., Gu Q., Bailey J. and Ma X. Exploring architectural ...

  3. TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST

    本文将介绍如何采用卷积神经网络(CNN)来处理Fashion-MNIST数据集. 程序流程如下: 1.准备样本数据 2.构建卷积神经网络模型 3.网络学习(训练) 4.消费.测试 除了网络模型的构建, ...

  4. 【jvm】04-我偷偷改了你编译后的class文件

    [jvm]04-我偷偷改了你编译后的class文件 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请 ...

  5. IPv6地址格式

    1.说明 IPv6是互联网协议的第六版, 现有IPv4只支持大概40亿个网络地址, 而IPv6支持3.4e38个网络地址. IPv4的地址长度是32位(bit), IPv6的地址长度是128位. 尽管 ...

  6. CSS基础 阴影相关属性设置

    一.字体阴影属性名:text-shadow:水平偏移量 垂直偏移量 模糊度 阴影颜色: html代码: <div>农夫山泉有点甜</div>css代码: div{ font-s ...

  7. mybatis-plus中查询出的字段为空

    数据查询出后其中几个字段为null 解决方法: 数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式. 所以mybatis-plus映射不到,修改实 ...

  8. go.mod file not found in current directory or any parent directory; see 'go help modules'

    go的环境设置问题,执行 go env -w GO111MODULE=auto 我的环境:Windows 7, Go 1.17 D:\Apps\GOPATH\src\code.oldboyedu.co ...

  9. Nacos配置管理最佳实践

    Nacos一个最常用的功能就是配置中心,在具体使用时往往是多个团队,甚至整个公司的研发团队都使用同一个Nacos服务.那么使用时如何保证配置在各个团队之间的隔离,又能保证配置管理的便捷性?下面就来介绍 ...

  10. Mysql设计遵循规则

    为什么要优化系统的吞吐量瓶颈往往出现在数据库的访问速度上随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢数据是存放在磁盘上的,读写速度无法和内存相比 如何优化设计数据库时:数据库表. ...