首页 > 其他分享 >关于线程池的两种创建方式

关于线程池的两种创建方式

时间:2024-07-11 21:29:56浏览次数:14  
标签:两种 int 创建 submit ++ 任务 线程 executorService

1.第一种方式Executors 工具类

固定大小线程池:newFixedThreadPool

单一线程池:newSingleThreadExecutor

可变线程池: newCachedThreadPool

调度线程池:newScheduledThreadPool

1.1单一线程池

该线程池只有一个线程,适用于需要按任务执行线程场景,保证任务的顺序性

//创建应该单一线程池
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
//        executorService.submit(new Runnable() {
//            @Override
//            public void run() {
//                for (int i = 0; i < 10; i++) {
//                    System.out.println(Thread.currentThread().getName()+"+++++++++++++++++"+i);
//
//                }
//            }
//        });

1.2固定大小线程池

ExecutorService executorService = Executors.newFixedThreadPool(5);
//        //创建任务
//        for (int i = 0; i < 5; i++) {
//            executorService.submit(new Runnable() {
//                @Override
//                public void run() {
//                    for (int j = 0; j < 5; j++) {
//                        System.out.println(Thread.currentThread().getName() + " 任务执行 " + j);
//                    }
//                }
//            });
//        }

线程数量固定,任务提交后会一直处于新建状态,直到线程池关闭。适用于需要限制并发请求的场景,服务器后台处理任务,web服务器等。

1.3 可变线程池

//创建一个可以自动改变大小的线程池
//        ExecutorService executorService = Executors.newCachedThreadPool();
//        for (int i = 0; i < 10; i++) {
//            executorService.submit(()->{
//                    System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//            });
//        }

特点:可以动态调整大小的线程池,根据任务数量自动增加线程数量。

使用场景:适用于需要大量处理短期任务的线程场景,如异步请求,服务器后台处理任务等。

1.4调度线程池:

 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//线程数量
//        for (int i = 0; i < 10; i++) {
//            scheduledExecutorService.schedule(()->{
//                System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~");
//            },5,TimeUnit.SECONDS);//5表示多长时间后执行任务 单位
//        }
            scheduledExecutorService.scheduleAtFixedRate(()->{
            },5,2,TimeUnit.SECONDS);

特点:可以定时或周期性执行任务

使用场景:适用于定时执行或周期性执行的线程场景,如定时数据备份,定时任务调度。

最后还需要关闭线程池,避免资源浪费

  //关闭线程池
//        executorService.shutdown();
//        //保证所有任务都执行完成
//        while (!executorService.isTerminated()) {
//        }

2.第二种方式:ThreadPoolExecutor

//核心参数的意思
/**
 * int corePoolSize,核心线程数的个数 2
 *  int maximumPoolSize,最大线程数量 5
 * long keepAliveTime, 非核心线程允许空闲的时间
 * TimeUnit unit, 时间的单位
 * BlockingQueue<Runnable> workQueue 堵塞队列中 3
 */

需要先创建一个堵塞队列的对象

ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(5);//创建堵塞队列
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 10, TimeUnit.SECONDS, arrayBlockingQueue);
for (int i = 0; i < 10; i++) {
    threadPoolExecutor.submit(()->{
        System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~~~");
    });
}

附加:

execute和submit方法区别

共同点:这两个方法都是用来执行线程任务的。

不同点:execute属于Excute类中的方法,而submit属于ExcutirService接口中的方法,而且submit可以执行Runable和Callable类型的任务,而execute只能执行Runable类型的任务,submit执行完任务有返回结果。

标签:两种,int,创建,submit,++,任务,线程,executorService
From: https://blog.csdn.net/wuzhaoyang11/article/details/140285915

相关文章

  • Linux创建组和用户groupadd:无法锁定/etc/group问题解决
    问题原因:相关关键文件进行了锁定,不能被访问和修改1.确认是否是使用root用户执行,2.确定文件权限没问题使用lsattr命令查看隐藏权限设定情况[abc@localhost~]$lsattr/etc/group----------------/etc/group[abc@localhost~]$lsattr/etc/passwd----------------/etc/......
  • Java中线程池的最佳实践
    一、使用正确的声明方式线程池必须手动通过ThreadPoolExecutor的构造函数来声明,避免使用Executors类创建线程池,会有OOM风险。Executors创建的线程池对象有以下弊端:FixedThreadPool和SingleThreadExecutor使用的是有界阻塞队列LinkedBlockingQueue,任务队列的默认长度和......
  • Java多线程&并发编程(二)
    一、CyclicBarrier、CountDownLatch、Semaphore的区别CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行(类似于一个栅栏拦住所有线程直到所有线程到达后在重新执行)CountDownLatch则不是,某线程运行到某个点上之后,......
  • 实战Qt开发WordBN笔记软件#02 通过Gitee创建YourWordBN仓库;学会GIT常用指令,并实现多分
    01背景【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件;WordBN基于VS2019、Qt6.5开发,使用QtQuick(QML)开发语言。本课程将以【WordBN字远笔记】的界面为实战基础,详细介绍如何基于Qt/QML开发语言,从零开始开发一套真正的程序,包括国际化、版本发布、安装包制作等项目......
  • Java异步判断线程池所有任务是否执行完成的方法
    1.使用ExecutorService和CountDownLatch的方法示例在Java中,当我们使用线程池(如ExecutorService)来执行异步任务时,常常需要知道所有任务是否都已经完成。ExecutorService接口提供了几种方式来处理这种情况,但最常用的是shutdown()和awaitTermination()方法的组合,或者使用Future和Com......
  • Linux设备驱动器 之二 线程同步第二篇
    Linux设备驱动器之二线程同步第二篇mutex数据结构LinuxAPIs在Linux驱动器中的应用NXPfreescale系列QSPI驱动器变量定义初始化存取数据semaphore数据结构LinuxAPIs在Linux驱动器中的应用ELAN的Uxxx系列驱动器变量定义初始化同步操作mutex数据结构stru......
  • Qt开发 | Qt创建线程 | Qt并发-QtConcurrent
    文章目录一、Qt创建线程的三种方法二、Qt并发:QtConcurrent介绍三、QtConcurrentrun参数说明四、获取QtConcurrent的返回值五、C++其他线程技术介绍一、Qt创建线程的三种方法  以下是Qt创建线程的三种方法:方法一:派生于QThread派生于QThread,这是Qt创建线程最常用......
  • VSCode创建创建vue项目
    一、前情提要注:只适用于个人,已安装node、修改过淘宝镜像等前期准备工作。因此直接开始进行项目创建二、创建新项目1、先创建一个文件夹,也可以通过VSCode打开已有文件夹。(此文件夹为新创建项目的上级文件夹)2、选中打开的文件夹,点击右上角打开终端,也可以通过查看打开终端3、......
  • Redis中设置增量缓存,减少对数据库的交互查询;启动@Async;异步线程
    //当属于这个分支的报文传入调用processMessage方法if((newJSONObject(dataMessage).optString("documentStatus")).equals("carWeizi_redis_service")){processMessage(dataMessage);}//processMessage中先把增量数据插入数据库,同时缓存redispublic......
  • Unity中用于处理 UI 的射线检测和事件处理的两种脚本
    GraphicRaycaster组件GraphicRaycaster是Unity中用于UI系统的射线检测组件。它主要用于检测屏幕上的图形界面元素(如按钮、图片、文本等)的点击事件,并将这些事件传递给相应的UI元素。主要功能射线检测:用于检测屏幕空间中的射线,确定用户点击了哪个UI元素。UI交互:处理......