手动创建线程池

一、什么是线程池?

线程池是一种线程的集合,线程池中包含了多个线程,这些线程可以轮流执行池中的任务,从而实现线程的复用,提高系统的效率,避免资源的浪费。线程池具有以下特点:

1、线程可以轮流执行,避免创建或销毁线程的开销

2、线程数量可以控制,防止系统因为线程过多而崩溃

3、线程池中的线程可以自动重用,不需要每次都重新创建线程

4、线程池可以根据不同的任务进行优先级排序,保证高优先级任务先执行

二、创建线程池的步骤

创建线程池的步骤如下:

1、创建一个线程池对象,设置线程池的属性,如核心线程数量、最大线程数量、线程空闲时间、等待队列长度、拒绝策略等等

2、创建一个等待队列,用于存放等待执行的任务

3、创建一个线程池管理器,用于管理线程池的状态,比如线程的创建、销毁、执行任务等

4、向线程池中添加任务,线程池会自动分配线程去执行任务

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyThreadPool {
    public static void main(String[] args) {
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //添加任务到线程池
        for(int i=0;i<10;i++){
            final int task = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"执行任务:"+task);
                }
            });
        }
        //关闭线程池
        executorService.shutdown();
    }
}

三、常见的线程池类型

Java中常见的线程池类型有如下几种:

1、FixedThreadPool:固定数量线程池,线程数量一旦设定就不会发生变化。

2、CachedThreadPool:缓存线程池,线程数量可以根据任务的多少自动调整。

3、SingleThreadExecutor:单线程线程池,只有一个线程在执行任务,适合于重要的任务需要顺序执行的场景。

4、ScheduledThreadPool:定时任务线程池,适用于需要按照一定的周期执行任务的场景。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class MyScheduledThreadPool {
    public static void main(String[] args) {
        //创建定时任务线程池
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
        //延迟1秒后执行任务
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"执行任务");
            }
        },1, TimeUnit.SECONDS);
        //每隔2秒执行一次任务
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"执行任务");
            }
        }, 0, 2, TimeUnit.SECONDS);
        //关闭线程池
        scheduledExecutorService.shutdown();
    }
}

四、线程池的拒绝策略

当线程池中的线程已经全部被占用,等待队列已经满了,此时如果还有新的任务进来,线程池就需要执行拒绝策略。Java中提供了四种线程池的拒绝策略。

1、AbortPolicy:拒绝新任务并抛出异常

2、CallerRunsPolicy:将新任务提交给调用线程来执行

3、DiscardOldestPolicy:将等待队列中最早的任务丢弃,将新任务添加到等待队列尾部

4、DiscardPolicy:直接丢弃新任务

import java.util.concurrent.*;

public class MyRejectedThreadPool {
    static class MyTask implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"执行任务");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        //创建线程池,设置拒绝策略为DiscardPolicy
        ExecutorService executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardPolicy());
        //添加任务到线程池
        for(int i=0;i<5;i++){
            executorService.execute(new MyTask());
        }
        //关闭线程池
        executorService.shutdown();
    }
}

五、线程池的最佳实践

1、尽量设置合适的线程数量

线程数量过多会导致系统开销过大,过少会导致系统无法充分利用资源。

2、合理的等待队列长度

等待队列长度过长会导致系统处理速度变慢,过短会导致任务不能得到处理。

3、使用合适的拒绝策略

不同的应用场景需要使用不同的拒绝策略。

4、合理的任务划分与设计

任务应该尽可能合理的拆分,并根据优先级和执行时间进行排序。

六、总结

线程池是一种用于管理线程的机制,具有复用线程、控制线程数量、自动重用、以及优先级等特点,可以提高系统效率,避免资源浪费。在使用线程池时,要注意线程池的属性设置、拒绝策略的选择、以及任务的合理划分与设计,从而达到最佳的效果。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/179903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-22 05:08
下一篇 2024-11-22 05:09

相关推荐

  • Python线程等待指南

    本文将从多个方面详细讲解Python线程等待的相关知识。 一、等待线程结束 在多线程编程中,经常需要等待线程执行完毕再进行下一步操作。可以使用join()方法实现等待线程执行完毕再…

    编程 2025-04-29
  • Python两个线程交替打印1到100

    这篇文章的主题是关于Python多线程的应用。我们将会通过实际的代码,学习如何使用Python两个线程交替打印1到100。 一、创建线程 在Python中,我们可以使用Thread…

    编程 2025-04-28
  • ROS线程发布消息异常解决方法

    针对ROS线程发布消息异常问题,我们可以从以下几个方面进行分析和解决。 一、检查ROS代码是否正确 首先,我们需要检查ROS代码是否正确。可能会出现的问题包括: 是否正确初始化RO…

    编程 2025-04-28
  • Python线程池并发爬虫

    Python线程池并发爬虫是实现多线程爬取数据的常用技术之一,可以在一定程度上提高爬取效率和数据处理能力。本文将从多个方面对Python线程池并发爬虫做详细的阐述,包括线程池的实现…

    编程 2025-04-27
  • 线程池中的一个线程异常了会被怎么处理

    本文将从以下几个方面对线程池中的一个线程异常了会被怎么处理进行详细阐述:异常的类型、如何捕获异常、异常的处理方式。 一、异常的类型 在线程池中,可以出现多种类型的异常,例如线程执行…

    编程 2025-04-27
  • 线程池的七个参数

    在多线程编程中,线程池是一种非常重要的编程模型,可以解决线程创建销毁的开销问题,提高程序的效率。在使用线程池时,需要对其七个参数进行配置,以达到最佳性能。下面将从多个方面详细阐述线…

    编程 2025-04-25
  • Java DelayQueue:实现延迟任务的线程安全队列

    一、DelayQueue的概述 Java的DelayQueue 是一个阻塞队列队列,主要用来实现对延迟任务的调度,也就是在指定的时间之后才能够取出任务来执行。该队列中保存的元素都必…

    编程 2025-04-23
  • 浏览器线程——从多个方面深入探讨

    一、浏览器线程的概念 浏览器线程是指浏览器中用于处理不同任务的线程。默认情况下,每个标签页都会有一个独立的进程,每个进程再包含多个线程,这些线程通过协同工作来完成浏览器的各项任务。…

    编程 2025-04-23
  • JMeter线程组详解

    一、线程组简介 JMeter作为一个负载测试工具,线程组是JMeter中非常重要的一个概念,它被用来模拟请求的发送。 简单来说,JMeter通过线程组来同时模拟多个用户对被测试的W…

    编程 2025-04-23
  • Java线程安全的集合

    Java的集合框架是广泛使用的标准库之一,它被设计为高效、灵活和安全。在多线程环境中,线程安全的集合至关重要,因为多个线程同时对同一个集合进行读写操作可能会导致数据的不一致和线程安…

    编程 2025-04-22

发表回复

登录后才能评论