Java线程池(超详细)

简介: Java线程池

1、基本概念

Java线程需要经过线程的创建,调用和销毁整个过程,频繁的创建和销毁会大大影响性能,所以引入的线程池:

好处:


提升性能:线程池能独立负责线程的创建、维护和分配

线程管理:每个Java线程池会保持一些基本的线程统计信息,对线程进行有效管理

2、JUC线程池架构

JUC指的是Java的并发工具包


1. Executor

Executor提供了execute()接口,用来执行已提交的Runnable目标实例,它只有1个方法:

void execute(Runnable command)

2. ExecutorService

继承于Executor.Java,异步目标任务的“执行者服务”接口,对外提供异步任务的接收服务

* @param task the task to submit
* @param <T> the type of the task's result
* @return a Future representing pending completion of the task
* @throws RejectedExecutionException if the task cannot be
*         scheduled for execution
* @throws NullPointerException if the task is null
*/
<T> Future<T> submit(Callable<T> task);//向线程池提交单个异步任务
//想线程池提交批量异步任务
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;


3. AbstractExecutorService

抽象类,实现了ExecutorService


4. ThreadPoolExecutor

线程池实现类,继承于AbstractExecutorService,JUC线程池的核心实现类


5. ScheduledExecutorService

继承于ExecutorService。它是一个可以完成“延时”和“周期性”任务的调度线程池接口


6. ScheduledThreadPoolExecutor

继承于ThreadPoolExecutor,实现了ExecutorService中延时执行和周期执行等抽象方法


7. Executors

静态工厂类,它通过静态工厂方法返回ExecutorService、ScheduledExecutorService等线程池示例对象


8. Executors创建线程的4种方法

newSingleThreadExecutor创建“单线程化线程池”

package threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class CreateThreadPollDemo {
    public static final int SLEEP_GAP=1000;
    static class TargetTask implements Runnable{
        static AtomicInteger taskNo=new AtomicInteger(1);
        private String taskName;
        public TargetTask()
        {
            taskName="task-"+taskNo;
            taskNo.incrementAndGet();
        }
        public void run()
        {
            System.out.println("task:"+taskName+" is doing...");
            try {
                Thread.sleep(SLEEP_GAP);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("task:"+taskName+" end...");
        }
    }
    public static void main(String[] args) {
        ExecutorService pool=Executors.newSingleThreadExecutor();
        for(int i=0;i<3;i++)
        {
            pool.execute(new TargetTask());
            pool.submit(new TargetTask());
        }
        pool.shutdown();
    }
}

Java线程池(超详细)


目录
相关文章
|
10天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
13天前
|
Java 程序员 数据库
Java线程池让使用线程变得更加高效
使用一个线程需要经过创建、运行、销毁三大步骤,如果业务系统每个线程都要经历这个过程,那会带来过多不必要的资源消耗。线程池就是为了解决这个问题而生,需要时就从池中拿取,使用完毕就放回去,池化思想通过复用对象大大提高了系统的性能。线程池、数据库连接池、对象池等都采用了池化技术,下面我们就来学习下线程池的核心知识、面试重点~
54 5
Java线程池让使用线程变得更加高效
|
1天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
9 1
|
3天前
|
缓存 Java
Java并发编程:深入理解线程池
【5月更文挑战第7天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,以及如何使用Java的Executor框架来创建和管理线程池。此外,我们还将讨论线程池的优点和缺点,以及如何选择合适的线程池大小。最后,我们将通过一个示例来演示如何使用线程池来提高程序的性能。
|
10天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
10天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】在Java中,线程池是一种管理线程的强大工具,它可以提高系统性能,减少资源消耗。本文将深入探讨Java线程池的工作原理,如何使用它,以及在使用线程池时需要注意的问题。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们管理线程资源,提高系统性能。本文将深入探讨线程池的工作原理、使用方法以及如何根据实际需求选择合适的线程池参数。通过阅读本文,你将能够更好地理解和使用Java线程池,提高你的并发编程能力。
|
11天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
【4月更文挑战第29天】 在现代Java应用中,高效地管理线程资源是至关重要的。线程池作为一种优化手段,其设计旨在减少在执行大量异步任务时创建和销毁线程的开销,同时提供一种机制来控制并发执行的任务数量。本文将深入探讨线程池的核心概念、使用场景以及它们如何影响系统性能。我们将剖析不同类型的线程池实现,并讨论如何根据具体需求选择合适的配置策略,以期帮助开发者避免常见的并发陷阱,提升应用的性能和稳定性。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】在Java并发编程中,线程池是提高程序性能和资源利用率的重要工具。本文将深入探讨线程池的工作原理、使用场景以及如何合理地配置线程池参数。通过阅读本文,你将能够更好地理解线程池的作用,并在实际应用中更加灵活地使用线程池。