jdk自带线程池实例详解

JDK自带线程池实例详解

线程池介绍

在应用程序开发中,使用线程是很常见的。当一个程序被执行时,它会生成一个主线程,这个主线程可以并行运行多个程序段。但如果程序中包含多个任务需要同时运行时,如果每个任务都创建自己的线程,这将会导致线程的大量创建和销毁,极度浪费资源。而线程池的出现解决了这个问题,它将多个任务合并在一起,让它们共享一个线程池中的线程完成任务。

线程池的实现

Java中提供了Executor框架来实现线程池。其中,Java.util.concurrent.Executor主要定义了线程的执行方式,通常我们可以通过ThreadPoolExecutor或ScheduledThreadPoolExecutor对其进行实现。

ThreadPoolExecutor

ThreadPoolExecutor实现了Executor框架的所有基本方法,并提供了一组可供我们调整的方法,以满足我们对线程池的各项要求。以下是ThreadPoolExecutor的构造函数:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
       // ...
}

构造ThreadPoolExecutor需要传入以下6个参数:

  • corePoolSize:核心线程池大小,当池中线程数少于corePoolSize时,虽然有新的任务提交,我们也会继续创建一个新的线程处理这个任务。
  • maximumPoolSize:线程池最大线程数。
  • keepAliveTime:空闲线程存活时间。
  • unit:空闲线程存活时间单位。
  • workQueue:用于暂存任务的阻塞队列,用于多余的任务排队等待执行。
  • handler:饱和策略。

示例

下面是一个简单的示例,展示如何使用线程池:

import java.util.concurrent.*;

public class MyThreadPool {

    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>());

        // 提交任务
        for(int i = 0; i < 10; i++) {
            executor.execute(new Task(i));
        }

        // 关闭线程池
        executor.shutdown();
    }
}


class Task implements Runnable {

    private int taskId;

    public Task(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Task " + taskId + " is running.");
    }
}

在上述示例中,我们创建了一个ThreadPoolExecutor实例,并使用execute()方法提交了10个任务。由于我们创建了一个LinkedBlockingQueue队列,因此所有的任务被一个个地排队执行。最后,我们通过调用了executor.shutdown()来关闭线程池。

另外,我们可以通过重写RejectedExecutionHandler来自定义饱和策略,以下是一个示例:

import java.util.concurrent.*;

public class MyThreadPool {

    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2),
                    (r, executor1) -> {
                        if (!executor1.isShutdown()) {
                            r.run();
                        }
                    });

        // 提交任务
        for(int i = 0; i < 10; i++) {
            executor.submit(new Task(i));
        }

        // 关闭线程池
        executor.shutdown();
    }
}


class Task implements Runnable {

    private int taskId;

    public Task(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Task " + taskId + " is running.");
    }
}

在以上示例中,我们使用的是一个有界的队列(队列大小为2),当线程池没有空闲的线程,且队列也已经满时,我们将仍需要提交的任务直接运行在当前线程上。这是通过自定义RejectionExecutionHandler实现的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jdk自带线程池实例详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Android同步异步任务与多线程及Handler消息处理机制基础详细讲解

    下面开始对“Android同步异步任务与多线程及Handler消息处理机制基础详细讲解”的完整攻略进行详细讲解。 基础概念 在Android开发中,我们常常需要处理一些耗时操作,如网络请求、图片加载等。为了避免这些操作阻塞主线程,我们需要使用异步任务和多线程来完成这些操作。 同步与异步 同步:在执行一个任务时,需等待该任务执行完毕后才能进行下一步操作; 异步…

    多线程 2023年5月16日
    00
  • C#多线程Thread使用示例详解

    下面我将详细讲解“C#多线程Thread使用示例详解”的完整攻略。 C#多线程Thread使用示例详解 什么是多线程? 在计算机里,线程是一个可执行的代码片段。我们可以将线程视为一堆计算机程序指令。一个程序可以同时运行多个线程。多线程技术可以让计算机同时处理多项任务,从而更加高效。 如何使用多线程? 在C#中,可以使用Thread类来实现多线程技术。具体使用…

    多线程 2023年5月17日
    00
  • Java多线程之ThreadLocal浅析

    Java多线程之ThreadLocal浅析 ThreadLocal 是 Java 中的一个用于多线程编程的类库,它提供了一个线程局部变量,每一个线程都有自己独立的副本,可以对该变量进行读写操作,而且互不影响,解决了多线程环境下共享数据的问题。 使用 ThreadLocal 先看下 ThreadLocal 的使用方式: public class ThreadL…

    多线程 2023年5月17日
    00
  • Java五种方式实现多线程循环打印问题

    想要实现多线程循环打印问题,可以使用Java中的五种方式,包括继承Thread类、实现Runnable接口、实现Callable接口、使用线程池和使用定时器Timer。 继承Thread类 继承Thread类是实现多线程的一种方式,需要重写Thread类的run()方法来创建线程。代码示例如下: public class ThreadDemo extends…

    多线程 2023年5月17日
    00
  • Entity Framework管理并发

    对于Entity Framework的并发管理,可以通过以下步骤进行设置和处理。 1. 设计数据库表 在设计数据库表时,需要考虑到并发操作可能会导致数据冲突的情况。可以为需要进行并发管理的数据表添加一个行版本号列。每次更新数据时自动将该列的值增加1。 以下为创建一个包含行版本号的记录的示例: CREATE TABLE Employee ( Id INT PR…

    多线程 2023年5月16日
    00
  • 详解java并发编程(2) –Synchronized与Volatile区别

    详解java并发编程(2) –Synchronized与Volatile区别 在Java并发编程中,Synchronized和Volatile是两个经常使用的关键字,但是它们的作用和使用场景还是有所区别。本篇攻略将详细介绍Synchronized和Volatile的使用场景、工作原理、优缺点,以及相互之间的区别。 Synchronized关键字 1. 使用…

    多线程 2023年5月16日
    00
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除 简述 并发标记清除是一种适用于堆内存的垃圾回收算法,通常用于大型的应用程序或者需要长时间运行的应用程序中。其主要的特点是多线程标记和清除,相对于其他垃圾回收算法,具备了更好的性能表现。 基本流程 并发标记清除的基本流程如下: 初始状态:堆中的所有对象都被标记为“未标记” 初始标记:从根对象开始,对所有可达的对象进行标记。该过程是…

    多线程 2023年5月16日
    00
  • 关于Java 并发的 CAS

    CAS(Compare and Swap)是一种并发机制,用于实现原子性操作。在并发编程中,当多个线程同时对共享变量进行操作时,会产生竞争条件(Race Condition),导致数据的不一致性、丢失、覆盖等问题。CAS机制通过比较期望值与实际值的方式,来确保正确性与一致性。 CAS的原理 CAS操作包括三个操作数:内存位置(V)、预期原值(A)和新值(B)…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部