package com.aaa.threaddemo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /*
*一 四种常见的线程池是啥?
* newFixedThreadPool
* 1.创建一个可重用固定线程数的线程池, 2.使用共享的无界队列方式来运行这些线程。
*
* newCachedThreadPool
* 1.可根据需要创建新线程的线程池 2.旧的线程可用时将重用他们 3.对短期异步的程序 可提高程序性能
*
* newSingleThreadExecutor
* 1.返回一个线程池,只有一个线程 2.可以在旧的线程挂掉之后,重新启动一个新的线程来替代它。 达到起死回生的效果。
*
* newScheduledThreadPool
* 给定一个延迟后,可以运行命令或者定期执行。
* java中线程池的顶级接口是Executor 严格而言,正在的线程池是ExecutorService
*
*二 阻塞队列 LinkedBlockingQueue 使用注意事项?
*
*三 线程池提交任务的方式?
*
*四 shutdown 的使用方式?
*
*五 线程池中的常用参数设置?
*/ /*
二 newFixedThreadPool
* 1.创建一个固定大小的线程池
* 2.提交一个任务,就创建一个线程,直到线程池的最大容量。
* 3.线程池的大小达到最大值,就保持不变。
* 4.有执行异常而结束的线程,线程池会补充一个新的线程。
* 5.使用完毕,必须手动关闭线程池,否则会一直存在内存中
*
* 看一下newFiexdThreadPool()的内心世界
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
*/ public class ThreaPoolUser {
public static void main(String[] args) {
ExecutorService fixedPool = Executors.newFixedThreadPool(2); //创建一个可重用,固定线程数的线程池 容量为 2 /*
线程池的容量是2,我这里放入了3个线程,线程池会如何处理?
可以看到这里有个没有指定容量的队列 linkedBlockingQueue,此时的队列就是一个无边界的队列。
可以不断的在队列中添加任务
多放一个问题不大,300000个呢? 任务过多,就会导致内存溢出。 【注意!】
linkedBlockingQueue
本身是一个用链表结实现的有界阻塞队列,容量是可以设置的。
较好的使用方式 五 ExecutorService executorService = new ThreadPoolExecutor(
10, //核心线程数
13, //线程池最大容量
60L, //非核心线程的生存时间
TimeUnit.SECONDS, //生存的时间单位
new ArrayBlockingQueue(10)); //设置队列中的容量
*/
FiexdDemo fiexdDemo = new FiexdDemo();
FiexdDemo fiexdDemo2 = new FiexdDemo();
FiexdDemo fiexdDemo3 = new FiexdDemo(); /*
三 线程池提交任务的方式有两种
* 1.execute
* 提交的是runnable类型的任务,下文的线程是继承了thread,thread又是runnable的实现类。
* 提交是没有返回值的
* 遇到异常直接抛出
*
* 2.submit
* runnable 和 callable 都可提交
* 返回一个future类型的对象
* 将异常存储,调用future get方法 才会抛出异常
*/
fixedPool.execute(fiexdDemo);
fixedPool.execute(fiexdDemo2);
fixedPool.execute(fiexdDemo3); /*
四 shutdown()
* 1.把线程池的状态设置为 shutdown,但是并不会马上停止
* 2.停止接受外部的submit 任务
* 3.线程池正在运行的任务,队列中等待的任务,会执行完
* 4.完成后,才是真正的停止
*/
fixedPool.shutdown(); //手动关闭线程池
}
} /*
* 上面已经创建好了一个固定的线程池,这边创建一个多线程。
* 把线程放进 线程池中就完事了。
*/
class FiexdDemo extends Thread{
@Override
public void run() {
System.out.println("我是一个线程");
System.out.println("[currentThread = ]" + Thread.currentThread().getName());
}
}

看下结果

常见线程池 newFixedThreadPool 的简单使用的更多相关文章

  1. 常见线程池之 newCacheThreadPool 缓存线程池 简单使用

    package com.aaa.threaddemo; import java.util.concurrent.BlockingQueue; import java.util.concurrent.E ...

  2. (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)

    上篇文章中介绍了单线程化线程池newSingleThreadExecutor,可控最大并发数线程池(newFixedThreadPool)与其最大的区别是可以通知执行多个线程,可以简单的将newSin ...

  3. 常见线程池 newScheduledThreadPool 定时执行任务的线程池 简单介绍

    一  定时任务 package com.aaa.threaddemo; import static java.util.concurrent.TimeUnit.NANOSECONDS; import ...

  4. JUC之线程池基础与简单源码分析

    线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...

  5. java 线程池 ---- newFixedThreadPool()

    class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...

  6. 6、java5线程池之固定大小线程池newFixedThreadPool

    JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...

  7. java 线程池newFixedThreadPool

    工作中遇到一个这样的情况,List中的元素要每个遍历出来,然后作为参数传给后面通过spark做数据处理,元素太多,一个一个的遍历速度太慢,于是考虑使用多线程,代码如下:(已删除部分代码) 想了解更多线 ...

  8. Executor线程池的简单使用

    我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...

  9. c++简单线程池实现

    线程池,简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他 ...

随机推荐

  1. 【LeetCode】173. Binary Search Tree Iterator 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 保存全部节点 只保留左节点 日期 题目地址:http ...

  2. 【LeetCode】781. Rabbits in Forest 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  3. 1048 - Conquering Keokradong

    1048 - Conquering Keokradong    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ...

  4. vue递归过滤树结构数组

    let arr=[{ title:'1', key:'1', type:0, children:[{ title:'1-1', key:'1-1', type:0, }] },{ title:'2', ...

  5. [git]初始化项目文件到git分支

    将本地和远程仓库关联并push本地项目 1.VCS -> import into Version Control  ->  Create Git Repository 选择项目文件   2 ...

  6. CS5212 pin to pin 替代RTD2166|DP转VGA芯片|CS5212转换电路设计方法

    CS5212适用于设计DP转VGA转换电路,主要用在嵌入式单片机基于工业机或者INTEL X86主板上面,也适用于多个电子配件市场和显示器应用程序,如笔记本电脑.主板.台式机.适配器.转换器和转接器. ...

  7. <数据结构>关键路径

    目录 AOV网和AOE网 AOV网 AOE网 定义 与AOV网的转化 AOE网中着重解决的两个问题 1.最长路径问题 2.关键活动问题 总结 最长路径 无正环的图 有向无环图的最短路径 其他情况 关键 ...

  8. Ubuntu安装Rocksdb并调试

    前言 第一次写博客^_^ 系统是全新的Ubuntu20.04,什么都没有,一切从头开始安装 查看gcc和g++版本 sudo apt-get update gcc --version g++ --ve ...

  9. MyBatis 一级缓存实现详解及使用注意事项

    一级缓存介绍 在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对 ...

  10. C# 设置或验证 PDF中的文本域格式

    概述 PDF中的文本域可以通过设置不同格式,用于显示数字.货币.日期.时间.邮政编码.电话号码和社保号等等.Adobe Acrobat提供了许多固定的JavaScripts用来设置和验证文本域的格式, ...