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. Java不可变类与final类

    概念 Java的不可变类是指八个基础类型的包装类和String,他们的数据成员是不可变的.使用加法等操作时,其实是创建了一个新的对象. Java的final类是对类用关键字final进行修饰,说明该类 ...

  2. 防止 jar 包被反编译

    1.隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式.例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问 ...

  3. Product Integration

    目录 生存模型 连续情形 离散情形 统一 Richard D. Gill, Product integration 一般的积分是指黎曼积分, 其计算是把区域无限细分求和并取极限, 有另外一种积分是把区 ...

  4. 使用 JavaScript 根据消费金额和消费者是否为会员确定折扣,最终核算实际应该支付的金额

    查看本章节 查看作业目录 需求说明: 根据消费金额和消费者是否为会员确定折扣,最终核算实际应该支付的金额 消费金额在 200 元以上的会员折扣是 7.5 折,消费金额没有达到 200 元的会员折扣是 ...

  5. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)

    查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...

  6. python 使用demical模块四舍五入

    前言: 断言部分需要用到四舍五入,首先使用的是python自带的round(),做四舍五入进位处理,但使用过程中,发现round似乎是当保留小数位的最后一位是偶数,和保留小数位后一位为5时,就不进位. ...

  7. Go语言系列- http编程和mysql

    http编程 一.Http协议  1. 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准.  2. 什么是http协议? http协议,是互联网中最常见的网络通信标准.  3 ...

  8. Apache Shiro反序列化远程代码执行复现

    最近也是看shiro漏洞比较多,所以自己也在本地复现了一下,拿出来与大家一起分享 0x00 关于Apache Shiro Apache shiro是一个Java安全框架,提供了认证.授权.加密和会话管 ...

  9. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  10. Java基础(十)——枚举与注解

    一.枚举 1.介绍 枚举类:类的对象只有有限个,确定的.当需要定义一组常量时,强烈建议使用枚举类.如果枚举类中只有一个对象,则可以作为单例模式的实现. 使用 enum 定义的枚举类默认继承了 java ...