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】373. Find K Pairs with Smallest Sums 解题报告(Python)

    [LeetCode]373. Find K Pairs with Smallest Sums 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/p ...

  2. 【剑指Offer】数字在排序数组中出现的次数 解题报告(Python)

    [剑指Offer]数字在排序数组中出现的次数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...

  3. JS常用的获取值和设值的方法

    1. input 标签<input type="text" name="username" id="name"/> 1) 获取i ...

  4. 【LeetCode】剑指 Offer 04. 二维数组中的查找

    二维数组查找:线性查找法 有二维数组: [  [1,   4,  7, 11, 15],  [2,   5,  8, 12, 19],  [3,   6,  9, 16, 22],  [10, 13, ...

  5. [opencv]二维码识别开发流程及问题复盘总结

    项目复盘总结 开发需求: 在桌面机器人(向下俯视)摄像头拍摄到的图像中做条形码识别与二维码识别. 条形码在图像固定位置,二维码做成卡片的形式在固定区域内随意摆放. 开发环境及相关库:ubuntu 18 ...

  6. 搞一下vue生态,从vuex开始

    Vuex vuex 是专门帮助vue管理的一个js库,利用了vue.js中细粒度数据响应机制来进行高效的状态更新. vuex核心就是store,store就是个仓库,这里采用了单一的store状态树, ...

  7. Java初学者作业——编写JAVA程序,要求输入技术部门5位员工的理论成绩和实操成绩,计算并输出各位员工的最终评测成绩。

    返回本章节 返回作业目录 需求说明: 某软件公司要求对技术部门的所有员工进行技能评测,技术评测分为两个部分:理论部分以及实操部分,最终评测成绩=理论成绩×0.4+实操成绩×0.6,要求输入技术部门5位 ...

  8. Oracle数据库导入csv文件(sqlldr命令行)

    1.说明 Oracle数据库导入csv文件, 当csv文件较小时, 可以使用数据库管理工具, 比如DBevaer导入到数据库, 当csv文件很大时, 可以使用Oracle提供的sqlldr命令行工具, ...

  9. PaperRead - Comparison of Fundamental Mesh Smoothing Algorithms for Medical Surface Models

    几种常见平滑算法的实现可以参见: 几种网格平滑算法的实现 - Jumanco&Hide - 博客园 (cnblogs.com) 1 Introduction 图像空间中相关的组织和结构,变换成 ...

  10. Docker_创建自定义镜像(5)

    生成docker镜像有两种方式 使用已有容器生成镜像 使用dockerfile生成镜像 一.使用已有容器生成镜像 1.下载centos镜像,并创建容器 2.进入容器部署python环境 centos镜 ...