首页 > 其他分享 >线程池

线程池

时间:2024-07-09 19:53:42浏览次数:24  
标签:ExecutorService Executors 创建 线程 executorService ThreadPoolExecutor

一、 线程池

1.什么是线程池

线程池:用于管理线程对象的池子。

2.为什么使用线程池?

一个线程大约占用的内存1M.
解决频繁创建线程和销毁线程消耗的性能。
解决大量创建线程而导致的内存泄露问题。

3.如何创建线程池

java中其实提供了两种方式:

第一种: 通过工具类完成线程池的创建.[Executors]. 语法简单。但是阿里巴巴不建议使用

第二种: 通过线程池类: ThreadPoolExecutor类. 语法复杂,但是阿里巴巴建议使用。灵活

线程的根接口: Executor. 里面只有一个方法: execute

子接口: ExecutorService。

第一种方案Executors:

  1. 固定大小的线程池对象newFixedThreadPool
  2. 单一线程池: newSingleThreadExecutor
  3. 可变线程池: newCachedThreadPool
  4. 延迟线程池: newScheduledThreadPool
public class Test01 {
    public static void main(String[] args) {
        //创建一个固定大小的线程池。返回类型为ExecutorService.
//        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //创建单一线程池【池子里面只有一个线程的对象】适合任务顺序执行的。
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //创建可变线程池。【池子中线程的数量会随着任务的大小而变化】
//        ExecutorService executorService = Executors.newCachedThreadPool();
        //延迟线程池:[指定时间后执行]
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);

        //执行线程任务。Runnable  Callable. Integer.MAX()整数的最大值。
//        for(int i=0;i<10;i++) {
            //1.必须传递Runnable对象。[1]自己创建一个类实现Runnable接口  [2]匿名内部类对象 [3]lambda表达式: 前提接口必须为函数式接口。
//            executorService.execute(new My());
//            executorService.execute(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(Thread.currentThread().getName()+"*************");
//                }
//            });
            //表示10秒后执行任务代码块。
//            executorService.schedule(()->{
//                System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~");
//            },10, TimeUnit.SECONDS);
            executorService.scheduleAtFixedRate(()->{
                System.out.println(Thread.currentThread().getName());
            },5,2,TimeUnit.SECONDS);
//        }
        //关闭线程池
    }
}

execute和submit方法区别?

这两个方法都是用来执行线程任务,但是execute属于Executor类中的方法,而submit属于ExecutorService接口中的方法。 而且submit可以执行runnable和callable类型的任务,而execute只能执行Runnable类型的任务。 submit执行完任务后有返回结果。

第二种方式ThreadPoolExecutor

public class Test02 {
    public static void main(String[] args) {
        //核心参数的意思
        /**
         * int corePoolSize,核心线程数的个数 2
         *  int maximumPoolSize,最大线程数量 5
         * long keepAliveTime, 非核心线程允许空闲的时间
         * TimeUnit unit, 时间的单位
         * BlockingQueue<Runnable> workQueue 堵塞队列中 3
         */
        BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue(5);
        ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(2,6,10, TimeUnit.SECONDS,workQueue);

        for (int i = 0; i <11; i++) {
            poolExecutor.submit(()->{
                System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~");
            });
        }
    }
}

标签:ExecutorService,Executors,创建,线程,executorService,ThreadPoolExecutor
From: https://www.cnblogs.com/zyqq/p/18292633

相关文章

  • 【Linux网络编程-4】线程
    开辟进程会分配新的地址空间,系统开销高。每个进程可以有很多线程,同个进程的线程共享地址空间,共享全局变量和对象,系统开销较低。头文件#include<pthread.h>pid类型pid类型pthread_t,实质是unsignedlongint,一串长长的无符号整数链接要指定pthread共享库g++-o......
  • Java Executors类的9种创建线程池的方法及应用场景分析
    在Java中,Executors类提供了多种静态工厂方法来创建不同类型的线程池。在学习线程池的过程中,一定避不开Executors类,掌握这个类的使用、原理、使用场景,对于实际项目开发时,运用自如,以下是一些常用的方法,V哥来一一细说:newCachedThreadPool():创建一个可缓存的线程池,如果线程池中......
  • 为什么用线程池?解释下线程池参数?
    基于:Java线程池七个参数详解参考:为什么使用线程池,参数解释、《Java编程的逻辑》-马俊昌为什么用线程池1、降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗;2、提高响应速度:任务来了,直接有线程可用可执行,而不用先创建线程,再执行;3、提高线程的可管理性:线程是稀缺资......
  • Java 线程池简单使用
    原文:使用线程池简介Java语言虽然内置了多线程支持,启动一个新线程非常方便,但是,创建线程需要操作系统资源(线程资源,栈空间等),频繁创建和销毁大量线程需要消耗大量时间。如果可以复用一组线程:┌─────┐execute┌──────────────────┐│Task1│───......
  • Python多线程与多进程编程:提升程序性能的实用技巧
    前言大家好!今天我们要深入探讨Python中的多线程与多进程编程,这可是提升程序并发性能的关键技能之一。记得我在处理大量数据时,通过多线程和多进程技术,大大提高了程序的执行效率。为了让大家也能掌握这些实用技巧,我将通过多个具体案例,详细讲解如何在Python中实现多线程和多......
  • Java线程之线程池
    1、什么是线程池?        线程池:用来管理线程对象的池子2、为什要使用线程池?               1、解决频繁的创建和销毁线程消耗的性能        2、解决大量创建线程而导致的内存泄露问题         注意:......
  • Java高级-线程池
    1.什么是线程池?用于管理线程对象的池子。2.为什么使用线程池?一个线程大约占用内存1M。 1.解决频繁创建线程和销毁线程消耗的性能。 2.解决大量创建线程而导致的内存泄漏问题。3.如何创建线程池?Java中提供了两种方式:第一种:通过工具类完成线程池的创建-:语法简......
  • 嵌入式C语言面试相关知识——CPU、进程和线程相关(相关问题很多,会经常过来更新)
    嵌入式C语言面试相关知识——CPU、进程和线程相关一、博客声明二、自问题目——CPU相关1、什么是中断?如何处理中断?2、解释上下文切换(ContextSwitch)?3、在嵌入式中如何优化CPU使用?三、自问题目——进程相关1、什么是进程?2、嵌入式系统中进程和线程的区别是什么?3、在嵌......
  • 深入理解C++线程池的实现
    深入理解C++线程池的实现在多线程编程中,线程池是一种重要的工具,用于管理和执行多个任务,有效地利用系统资源和提升程序性能。一、线程池的了解1.理解线程池的基本概念与作用线程池由任务队列和一组工作线程组成,任务队列用于存储待执行的任务,工作线程则负责从队列中取出......
  • rust线程池
    #![allow(unused)]usestd::sync::{mpsc,Arc,Mutex};usestd::thread;//定义消息类型,可以是新任务或终止信号enumMessage{NewJob(Job),Terminate,}//定义线程池结构体pubstructThreadPool{workers:Vec<Worker>,//sender:mpsc::Sender<J......