jdk自带线程池实例详解

yizhihongxing

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日

相关文章

  • Java线程的基本概念

    Java线程的基本概念 在Java中,一个线程就是一个独立的执行流程,它可以完成特定的任务,以此实现多任务并行处理。Java中的多线程处理提供了一种并发执行应用程序的方式,运行时系统可以同时启动多个线程去执行同一个程序的不同部分,从而提高系统的响应速度和处理能力。 在Java中,线程是由线程对象表示的,线程对象通常在运行时系统中创建,同时,每个线程都有一个与…

    多线程 2023年5月17日
    00
  • 如何最大限度地降低多线程C#代码的复杂性

    如何最大限度地降低多线程C#代码的复杂性?下文将介绍三个主要的攻略。 1. 使用异步编程 使用异步编程是降低代码复杂性的一个非常重要的方法。尤其是在处理长时间运行的操作时,可以使用异步编程来避免阻塞主线程,同时可以提高程序的响应速度,让我们的程序更加高效。在使用异步编程时,我们需要使用 async 和 await 关键字。 以下代码演示了如何在不堵塞主线程的…

    多线程 2023年5月16日
    00
  • Java中的多线程一定就快吗?

    Java中的多线程不一定就比单线程的程序更快,这取决于代码的实现方式、线程的数量、可用的资源等因素。下面我来详细讲解一下。 多线程带来的优势 Java中的多线程可以带来以下优势: 提高程序的响应速度:多线程可以让程序同时处理多个任务,提高程序响应速度。 最大化利用CPU:多线程可以让CPU在短时间内处理多个任务,最大化地利用CPU性能。 改善程序的结构:多线…

    多线程 2023年5月17日
    00
  • 2020年并发编程面试题(吐血整理)

    这里我将详细讲解一下“2020年并发编程面试题(吐血整理)”的完整攻略。 1. 背景介绍 该面试题是一篇介绍Java并发编程相关知识的文章,旨在帮助读者了解各种并发编程的细节与注意事项,提高其在面试过程中的表现。 2. 面试题概况 该面试题由40道题目组成,涉及到Java并发编程的多个方面,包括线程、锁、并发容器、线程协作、并发编程工具类等。 其中,每道题目…

    多线程 2023年5月16日
    00
  • 详解多线程及Runable 和Thread的区别

    详解多线程及Runnable和Thread的区别 什么是多线程? 多线程是指同时执行多个线程,每个线程都是在单独的CPU上运行,分别处理不同的任务。相比于单线程,多线程可以提高程序的并发性和效率。 Thread和Runnable的区别 Thread和Runnable是Java中处理多线程的两个关键类。 Thread Thread类是Java中的一个线程实例,…

    多线程 2023年5月17日
    00
  • 一个PHP并发访问实例代码

    下面是一个PHP并发访问实例代码的完整攻略。 1. 准备工作 在进行并发访问之前,需要先确保本地环境与所要访问的网站的配置能够支持并发访问。 首先,需要在本地安装PHP,建议安装PHP 7.x版本。其次,需要安装cURL扩展以便发送并发请求。最后,需要确保所要访问的网站能够允许并发访问,否则可能会被服务器拒绝访问。 2. 编写代码 使用PHP进行并发访问通常…

    多线程 2023年5月16日
    00
  • 关于Mysql隔离级别、锁与MVCC介绍

    接下来我将为您详细讲解“关于MySQL隔离级别、锁与MVCC介绍”的完整攻略,包含以下几个方面: MySQL的隔离级别,包括四种基本的隔离级别,以及每种隔离级别所带来的影响。 MySQL的锁机制,包括共享锁(read-lock)、排他锁(write-lock)等类型的锁,以及如何判断一个操作是否需要加锁。 MySQL的MVCC机制,包括该机制的基本原理,如何…

    多线程 2023年5月17日
    00
  • 使用Redis incr解决并发问题的操作

    使用Redis incr操作可以解决并发问题。在Redis中,incr命令表示给定键的值增加1。在多人并发访问同一个键时,incr命令可以一定程度上解决并发问题。 以下是采取Redis incr解决并发问题的攻略: 1、设计键名 在设计键名时,应该遵循以下原则: 键名要尽可能简短和清晰易懂,以利于代码编写和阅读。 键名应该尽可能遵循命名规范,包括大小写、下划…

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