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】475. Heaters 解题报告(Python & C++)

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

  2. 【LeetCode】227. Basic Calculator II 解题报告(Python)

    [LeetCode]227. Basic Calculator II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  3. 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)

    [剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  4. 「算法笔记」期望 DP 入门

    一.数学期望 1. 由来 在 \(17\) 世纪,有一个赌徒向法国著名数学家帕斯卡挑战,给他出了一道题目:甲乙两个人赌博,他们两人获胜的机率相等,比赛规则是先胜三局者为赢家,一共进行五局,赢家可以获得 ...

  5. ELBO surgery: yet another way to carve up the variational evidence lower bound

    目录 概 主要内容 Evidence minus posterior KL Average negative energy plus entropy Average term-by-term reco ...

  6. matplotlib 进阶之Legend guide

    目录 matplotlib.pyplot.legend 方法1自动检测 方法2为现有的Artist添加 方3显示添加图例 控制图例的输入 为一类Artist设置图例 Legend 的位置 loc, b ...

  7. C语言string操作

    创建方式 字符数组:空间已定 字符指针:未分配空间 初始化 字符数组: 创建与赋值必须在同一行 指定大小:未填满部分用'\0'填充 用字符串初始化:末尾自动添加'\0' 不初始化赋值则乱值 字符指针: ...

  8. Java高级程序设计笔记 • 【第6章 设计模式】

    全部章节   >>>> 本章目录 6.1 设计模式 6.1.1 设计模式概述和分类 6.1.2 单列模式介绍 6.1.3 单例模式的实现 6.1.4 实践练习 6.2 单例模式 ...

  9. C#中的值传递与引用传递(in、out、ref)

    在C#中,方法.构造函数可以拥有参数,当调用方法或者构造函数时,需要提供参数,而参数的传递方式有两种(以方法为例): 值传递 值类型对象传递给方法时,传递的是值类型对象的副本而不是值类型对象本身.常用 ...

  10. APP自动化测试之手机滑屏

    相信大家在安装一个APP之后,进入之前会有几个页面组成的滑屏欢迎页面,要对这个APP进行自动化测试之前,就需要实现自动滑屏,怎么实现呢?请继续往下看 滑屏分 左滑和右滑,上滑.下滑 实现的原理(左滑) ...