解读线程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)区别

 更新时间:2024年08月06日 14:46:35   作者:Ahuuua  
这篇文章主要介绍了解读线程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

线程池Executors的newSingleThreadExecutor和newFixedThreadPool(1)

与其他等效的newFixedThreadPool(1)不同

  • newSingleThreadExecutor返回的执行器保证不可重新配置。

与其他等效的newScheduledThreadPool(1)不同

  • newSingleThreadScheduledExecutor返回的执行器保证不可重新配置以使用其他线程。

newFixedThreadPool(1)的返回结果我们可以通过强转变成ThreadPoolExecutor,但是这个类是可以自行指定线程数的。

我们可以通过setCorePoolSize方法来修改。

这样也就是说,这两个方法的最大的区别是第一个方法可以修改线程的数量,如果用来指定线程数量为1是不安全的。

newSingleThreadExecutor方法则通过提供了一个包装类完全堵住了这个漏洞。

举个例子

拿newSingleThreadExecutor和newFixedThreadPool(1)举例

import org.junit.Test;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
 
public class ThreadPoolDemo {
    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("开始");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("结束" + Thread.currentThread().getName());
        }
    }
 
    @Test
    public void test() throws InterruptedException {
        //创建Runnable实例对象
        MyRunnable r = new MyRunnable();
 
        //创建线程池对象
        System.out.println("fixedThreadPool");
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);//包含1个线程对象
        for (int i = 0; i < 10; i++) {
            fixedThreadPool.submit(r);
        }
        Thread.sleep(10000);
        /**
         * 以上输出:
         * fixedThreadPool
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         * 开始
         * 结束pool-1-thread-1
         */
 
        System.out.println("singleThreadExecutor");
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            singleThreadExecutor.submit(r);
        }
        Thread.sleep(10000);
        /**
         * 以上输出:
         * singleThreadExecutor
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         * 开始
         * 结束pool-2-thread-1
         */
 
        System.out.println("fixedThreadPool(5)");
        ((ThreadPoolExecutor) fixedThreadPool).setCorePoolSize(5);
        for (int i = 0; i < 10; i++) {
            fixedThreadPool.submit(r);
        }
        Thread.sleep(10000);
        /**
         * 以上输出:
         * fixedThreadPool(5)
         * 开始
         * 开始
         * 开始
         * 开始
         * 开始
         * 结束pool-1-thread-1
         * 结束pool-1-thread-5
         * 结束pool-1-thread-2
         * 结束pool-1-thread-3
         * 结束pool-1-thread-4
         * 开始
         * 结束pool-1-thread-4
         * 开始
         * 结束pool-1-thread-4
         * 开始
         * 结束pool-1-thread-4
         * 开始
         * 结束pool-1-thread-4
         * 开始
         * 结束pool-1-thread-4
         * singleThreadExecutor(5)
         */
 
        System.out.println("singleThreadExecutor(5)");
        ((ThreadPoolExecutor) singleThreadExecutor).setCorePoolSize(5);
        for (int i = 0; i < 10; i++) {
            singleThreadExecutor.submit(r);
        }
        /**
         * 以下输出:
         * Exception in thread "main" java.lang.ClassCastException: java.util.concurrent.Executors$FinalizableDelegatedExecutorService cannot be cast to java.util.concurrent.ThreadPoolExecutor
         * 	at ThreadPoolDemo.main(ThreadPoolDemo.java:33)
         */
    }
}
 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • @Scheduled 如何读取动态配置文件

    @Scheduled 如何读取动态配置文件

    这篇文章主要介绍了@Scheduled 如何读取动态配置文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring Boot集成Spring Cache过程详解

    Spring Boot集成Spring Cache过程详解

    这篇文章主要介绍了Spring Boot集成Spring Cache过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Nacos客户端本地缓存和故障转移方式

    Nacos客户端本地缓存和故障转移方式

    Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceInfoHolder缓存服务信息,FailoverReactor处理故障转移,包括开启故障转移开关、读取备份文件等
    2024-12-12
  • 将Bean注入Spring容器中的常用方式分享

    将Bean注入Spring容器中的常用方式分享

    在Spring框架中,有多种方式可以将Bean(即对象)放入Spring容器中,这篇文章就给大家介绍一些常用的方式,文中有详细的代码示例,感兴趣的同学可以参考阅读下
    2023-06-06
  • Java动态字节码注入技术的实现

    Java动态字节码注入技术的实现

    Java动态字节码注入技术是一种在运行时修改Java字节码的技术,本文主要介绍了Java动态字节码注入技术的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 基于StringUtils工具类的常用方法介绍(必看篇)

    基于StringUtils工具类的常用方法介绍(必看篇)

    下面小编就为大家带来一篇基于StringUtils工具类的常用方法介绍(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • mybatisPlus批量插入优化加快性能

    mybatisPlus批量插入优化加快性能

    这篇文章主要介绍了mybatisPlus批量插入优化加快性能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • Java基于中介者模式实现多人聊天室功能示例

    Java基于中介者模式实现多人聊天室功能示例

    这篇文章主要介绍了Java基于中介者模式实现多人聊天室功能,详细分析了中介者模式的概念、原理以及使用中介模式实现多人聊天的步骤、操作技巧与注意事项,需要的朋友可以参考下
    2018-05-05
  • idea中断点类型之All和Thread的区别介绍

    idea中断点类型之All和Thread的区别介绍

    使用all模式对于程序中含有多个线程来说,会将多个线程都阻塞在断点,此时所有的线程都执行到此处,在最后一个线程执行到此处是会发生暂停,在这之前的线程会继续执行到任意位置,本文给大家详细介绍下idea中断点类型之All和Thread的区别,感兴趣的朋友一起看看吧
    2022-03-03
  • Java动态代理的示例详解

    Java动态代理的示例详解

    动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在程序运行时根据需要动态的创建目标类的代理对象。本文将通过案例详细讲解一下动态代理,需要的可以参考一下
    2022-02-02

最新评论