public static ExecutorSevice newSingleThreadExecutor()

public static ExecutorSevice newFixedThreadPool()

public static ExecutorSevice newCachedThreadPool()

public static ScheduledExecutorService newScheduledThreadPool()

public static ExecutorService newWorkStealingPool()

new ForkJoinPool()

newCachedThreadPool() :创建一个 ExecutorService,该 ExecutorService 根据需要来创建线程,可以重复利用已存在的线程来执行任务。

newFixedThreadPool(int numberOfThreads) :创建一个可重复使用的、固定线程数量的 ExecutorService。

newScheduledThreadPool(int corePoolSize):根据时间计划,延迟给定时间后创建 ExecutorService(或者周期性地创建 ExecutorService)。

newSingleThreadExecutor():创建单个工作线程 ExecutorService。

newSingleThreadScheduledExecutor():根据时间计划延迟创建单个工作线程 ExecutorService(或者周期性的创建)。

newWorkStealingPool():创建一个拥有多个任务队列(以便减少连接数)的 ExecutorService

new ForkJoinPool() 并行地实现分治算法

newSingleThreadExecutor()和newFixedThreadPool(1)有什么区别呢?

上面说了那么多,答案应该也很显而易见了,实际上差别仅仅在于newSingleThreadExecutor()返回的线程池少暴露了一些方法并且多了个finalize方法保证线程池调用shutdown(),仅此而已

网上有一些错误的回答,比如说前者线程执行期间抛出异常仍然能保证又其他线程顶替他,而后者不行,这样的回答都是错的。想要论证这是错的实际上很简单,对newFixedThreadPool(1)进行测试:


 
  1. package newFixedThreadPool;

  2. import java.util.concurrent.ExecutorService;

  3. import java.util.concurrent.Executors;

  4. public class Test {

  5. public static void main(String[] args) {

  6. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

  7. int i = 0;

  8. while (i++<10) {

  9. final int index = i;

  10. fixedThreadPool.execute(new Runnable() {

  11. @Override

  12. public void run() {

  13. if(index == 1){

  14. throw new IllegalStateException("handler exception");//线程运行时抛出异常

  15. }

  16. System.out.println(Thread.currentThread().getName() + "执行");

  17. try {

  18. Thread.sleep(3000);//模拟当前线程执行其他操作 花费3s

  19. } catch (InterruptedException e) {

  20. e.printStackTrace();

  21. }

  22. }

  23. });

  24. }

  25. fixedThreadPool.shutdown();

  26. }

  27. }

运行结果如下:

可以看到对于newFixedThreadPool(1),当一个线程在运行时抛出异常也会有其他线程顶替他去完成接下来的任务。

接下来对newSingleThreadExecutor()方法进行测试:


 
  1. package newSingleThreadExecutor;

  2. import java.util.concurrent.ExecutorService;

  3. import java.util.concurrent.Executors;

  4. public class Test {

  5. public static void main(String[] args) {

  6. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

  7. int i = 0;

  8. while (i++ < 10) {

  9. final int index = i;

  10. singleThreadExecutor.execute(new Runnable() {

  11. @Override

  12. public void run() {

  13. if(index == 1){

  14. throw new IllegalStateException("handler exception");

  15. }

  16. System.out.println(Thread.currentThread().getName() + "执行" + "No." + index);

  17. }

  18. });

  19. }

  20. singleThreadExecutor.shutdown();

  21. }

  22. }

执行结果如下:

对于newSingleThreadExecutor()来说,也是当线程运行时抛出异常的时候会有新的线程加入线程池替他完成接下来的任务。

1. LinkedBlockingQueue

无界队列。可以一直添加任务,直到内存溢出。

2. SynchronousQueue

没有容量的队列。一个任务都不能放进去。

3. DelayedWorkQueue

延迟工作的队列。

4. WorkQueue

支持工作窃取的队列。

1. void execute(Runnable command);

直接提交,没有返回值。

2. <T> Future<T> submit(Callable<T> task);

任务有返回值,通过 Future 获得返回值。

3. Future<?> submit(Runnable task)

任务没有返回值,任务完成后,通过 Future 得到的是 null。

java中线程池的使用的更多相关文章

  1. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

  2. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  3. Java中线程池,你真的会用吗?ExecutorService ThreadPoolExcutor

    原文:https://www.hollischuang.com/archives/2888 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及 ...

  4. Java中线程池的学习

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...

  5. java中线程池的使用方法

    1 引入线程池的原因 由于线程的生命周期中包括创建.就绪.运行.阻塞.销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建.销毁线程需要很大的 ...

  6. Java中线程池的实现原理

    知识点总结 ---------------------------------------------------------------------------------------------- ...

  7. Java中线程池的实现原理-求职必备

    jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 初始化线程池(4种) ...

  8. JAVA中线程池的简单使用

    比如现在有10个线程,但每次只想运行3个线程,当这3个线程中的任何一个运行完后,第4个线程接着补上.这种情况可以使用线程池来解决,线程池用起来也相当的简单,不信,你看: package com.dem ...

  9. java中线程池的几种实现方式

    1.线程池简介:    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.        假设一个服务器完成一项任务所需时间为:T1 创建 ...

  10. 第九章 Java中线程池

    Java中的线程池是运用场景最多的并发框架,几乎所有需求异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 降低资源消耗:通过重复利用已创建的线程降低线程创建和 ...

随机推荐

  1. Ubuntu 14.10 下安装伪分布式hdoop 2.5.0

    折腾了一天,其间配置SSH时候出现了问题,误删了ssh-keygen相关文件,导致配置SSH彻底萎了,又重装了系统.... 采用伪分布式模式,即hadoop将所有进程运行于同一台主机上,但此时Hado ...

  2. Flume的Sink

    一.Logger Sink 记录指定级别(比如INFO,DEBUG,ERROR等)的日志,通常用于调试 要求,在 --conf(-c )参数指定的目录下有log4j的配置文件 根据设计,logger ...

  3. Flume的Source

    source学习网址: http://flume.apache.org/FlumeUserGuide.html 一.Avro 类型的Source 监听Avro 端口来接收外部avro客户端的事件流.和 ...

  4. 透过CAT,来看分布式实时监控系统的设计与实现

    2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一. 在当今互联网时代,业务 ...

  5. 解决Kubernetes 1.7.3 kube-apiserver频繁异常重启的问题(转)

    原文的帖子无法访问,我只能粘贴内容 近期将之前的一个用Kubernetes 1.3.7的环境更换为最新发布的用kubeadm安装的Kubernetes 1.6.4 Dashboard无法访问的问题&g ...

  6. sqlserver 查询重复数据

    use StudentManageDB go ,,) ,,) ,,) select * from ScoreList order by StudentId --在知道那个字段重复的情况 --查询所有重 ...

  7. Android MVP案例;

    就一个十分简单的获取列表数据并展示的Demo:分别使用MVC和MVP实现: 先来一个假的数据源: //假设这就是数据源 public class UserBean { public static Li ...

  8. 让MySql支持表情符号(MySQL中4字节utf8字符保存方法)

    UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去. 解决方案:将编码从utf8转换成utf8mb4. 1. 修改my.in ...

  9. spring启动找不到spring.liveBeansView.mbeanDomain配置

    做项目时,启动tomcat报错 JNDI lookup for name [spring.liveBeansView.mbeanDomain] threw NamingException with m ...

  10. postgresql copy的使用方式

    方法一: 将数据库表复制到磁盘文件: copy "Test" to 'G:/Test.csv' delimiter ',' csv header encoding 'GBK'; 从 ...