Java线程池的入门

这篇具有很好参考价值的文章主要介绍了Java线程池的入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、线程池的优势

1.降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗。

2.提高系统相应速度,当有任务到达时,通过复用已存在的行程,无需等待新线程的创建便能立刻执行。

3.方便线程并发数的管控,因为线程若是无限制创建,可能会导致内存占用过多而产生内存溢出,并且会造成cpu过度切换。

4.提供更强大的功能,延时定时线程池。

二、线程池的种类

Executors类提供了4种不同的线程池:newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor。

1.newCachedThreadPool:用来创建一个可以无限扩大到线程池,适用于负载较轻的场景,执行短期异步任务。

2.newFixedThreadPool:创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于负载较重的场景,对当前线程数量进行限制。

3.newScheduledThreadPool:适用于执行延时或周期性的任务。

4.newSingleThreadExecutor:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。

三、线程池的测试

先创建一个自定义的线程类

示例代码如下;

import java.util.Date;

/**
 * @author qinxun
 * @date 2023-06-13
 * @Descripion: 自定义线程类
 */
public class MyRunnable implements Runnable {

    private String name;

    public MyRunnable(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + "->start time:" + new Date());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(name + "->end time:" + new Date());
    }
}

1.使用newCachedThreadPool创建可缓存的线程池

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

/**
 * @author qinxun
 * @date 2023-06-13
 * @Descripion: 线程池测试
 */
public class ExecutorsDemo {
    public static void main(String[] args) {
        // 可缓存的线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            MyRunnable runnable = new MyRunnable(String.valueOf(i));
            executorService.execute(runnable);
        }
        executorService.shutdown();
        System.out.println("Main Thread:Finished at:" + new Date());
    }
}

程序执行结果:

0->start time:Tue Jun 13 15:18:31 CST 2023
4->start time:Tue Jun 13 15:18:31 CST 2023
2->start time:Tue Jun 13 15:18:31 CST 2023
3->start time:Tue Jun 13 15:18:31 CST 2023
1->start time:Tue Jun 13 15:18:31 CST 2023
Main Thread:Finished at:Tue Jun 13 15:18:31 CST 2023
4->end time:Tue Jun 13 15:18:31 CST 2023
3->end time:Tue Jun 13 15:18:31 CST 2023
1->end time:Tue Jun 13 15:18:31 CST 2023
0->end time:Tue Jun 13 15:18:31 CST 2023
2->end time:Tue Jun 13 15:18:31 CST 2023

2.使用newFixedThreadPool创建固定长度的线程池。

示例代码如下:

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

/**
 * @author qinxun
 * @date 2023-06-13
 * @Descripion: 线程池测试
 */
public class ExecutorsDemo {
    public static void main(String[] args) {
        // 创建固定长度的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 5; i++) {
            MyRunnable runnable = new MyRunnable(String.valueOf(i));
            executorService.execute(runnable);
        }
        executorService.shutdown();
        System.out.println("Main Thread:Finished at:" + new Date());
    }
}

程序执行结果:

Main Thread:Finished at:Tue Jun 13 15:23:03 CST 2023
0->start time:Tue Jun 13 15:23:03 CST 2023
2->start time:Tue Jun 13 15:23:03 CST 2023
1->start time:Tue Jun 13 15:23:03 CST 2023
0->end time:Tue Jun 13 15:23:03 CST 2023
1->end time:Tue Jun 13 15:23:03 CST 2023
2->end time:Tue Jun 13 15:23:03 CST 2023
4->start time:Tue Jun 13 15:23:03 CST 2023
3->start time:Tue Jun 13 15:23:03 CST 2023
4->end time:Tue Jun 13 15:23:03 CST 2023
3->end time:Tue Jun 13 15:23:03 CST 2023

我们发现前面固定的3个线程先执行,后续才创建新的线程来执行任务。

3.使用newSingleThreadExecutor创建单线程线程池

示例代码如下:

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

/**
 * @author qinxun
 * @date 2023-06-13
 * @Descripion: 线程池测试
 */
public class ExecutorsDemo {
    public static void main(String[] args) {
        // 创建单线程线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            MyRunnable runnable = new MyRunnable(String.valueOf(i));
            executorService.execute(runnable);
        }
        executorService.shutdown();
        System.out.println("Main Thread:Finished at:" + new Date());
    }
}

程序执行结果:

Main Thread:Finished at:Tue Jun 13 15:27:15 CST 2023
0->start time:Tue Jun 13 15:27:15 CST 2023
0->end time:Tue Jun 13 15:27:15 CST 2023
1->start time:Tue Jun 13 15:27:15 CST 2023
1->end time:Tue Jun 13 15:27:15 CST 2023
2->start time:Tue Jun 13 15:27:15 CST 2023
2->end time:Tue Jun 13 15:27:15 CST 2023
3->start time:Tue Jun 13 15:27:15 CST 2023
3->end time:Tue Jun 13 15:27:15 CST 2023
4->start time:Tue Jun 13 15:27:15 CST 2023
4->end time:Tue Jun 13 15:27:15 CST 2023

我们发现当前的线程是一个个顺序执行的。

4.使用newScheduledThreadPool实现延迟或定时的线程池

scheduleAtFixedRate:按指定频率周期执行某个任务,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。

scheduleWithFixedDelay:周期定时执行某个任务/按指定频率间隔执行某个任务(注意)是以上一个任务结束时开始计时,period时间过去后,立即执行。

示例代码如下:

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

/**
 * @author qinxun
 * @date 2023-06-13
 * @Descripion: 线程池测试
 */
public class ExecutorsDemo {
    public static void main(String[] args) {
        // 创建单线程线程池
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);
        for (int i = 0; i < 5; i++) {
            MyRunnable runnable = new MyRunnable(String.valueOf(i));
            // 延迟1秒,每隔3秒执行一遍(上一个任务结束开始计时)
            executorService.scheduleAtFixedRate(runnable, 1, 3, TimeUnit.SECONDS);
        }
        //executorService.shutdown();
        System.out.println("Main Thread:Finished at:" + new Date());
    }
}

程序执行结果:文章来源地址https://www.toymoban.com/news/detail-482641.html

Main Thread:Finished at:Tue Jun 13 15:44:10 CST 2023
0->start time:Tue Jun 13 15:44:11 CST 2023
2->start time:Tue Jun 13 15:44:11 CST 2023
1->start time:Tue Jun 13 15:44:11 CST 2023
0->end time:Tue Jun 13 15:44:11 CST 2023
2->end time:Tue Jun 13 15:44:11 CST 2023
3->start time:Tue Jun 13 15:44:11 CST 2023
1->end time:Tue Jun 13 15:44:11 CST 2023
4->start time:Tue Jun 13 15:44:11 CST 2023
4->end time:Tue Jun 13 15:44:12 CST 2023
3->end time:Tue Jun 13 15:44:12 CST 2023
0->start time:Tue Jun 13 15:44:14 CST 2023
2->start time:Tue Jun 13 15:44:14 CST 2023
1->start time:Tue Jun 13 15:44:14 CST 2023
1->end time:Tue Jun 13 15:44:14 CST 2023
0->end time:Tue Jun 13 15:44:14 CST 2023
2->end time:Tue Jun 13 15:44:14 CST 2023
4->start time:Tue Jun 13 15:44:14 CST 2023
3->start time:Tue Jun 13 15:44:14 CST 2023

到了这里,关于Java线程池的入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 线程池的原理与实现

    最近在学习线程池、内存控制等关于提高程序运行性能方面的编程技术,线程池就是其中之一,一提到线程,我们会想到以前《操作系统》的生产者与消费者,信号量,同步控制等等。 一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议 :在阅读本文前,先理

    2024年02月13日
    浏览(33)
  • Java 线程池的基本操作

    2024年02月20日
    浏览(33)
  • 你知道 Java 线程池的原理吗?

    Java线程池是用于管理和复用线程的机制,它可以帮助开发者有效地管理线程的生命周期和资源,并提高应用程序的性能和稳定性。 1. 线程池概述 在计算机科学中,线程池是一种可用来执行异步任务的线程队列。它主要包含以下几个组成部分: 工作队列(BlockingQueue) :用于

    2024年04月12日
    浏览(41)
  • Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors

    线程池介绍 什么是线程池 ? 线程池就是一个可以复用线程的技术。 不使用线程池的问题 : 如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。 线程池工作原理 : 例如线程池

    2023年04月16日
    浏览(44)
  • SpringBoot线程池和Java线程池的用法和实现原理

    @ 目录 使用默认的线程池 方式一:通过 @Async 注解调用 方式二:直接注入 ThreadPoolTaskExecutor 线程池默认配置信息 SpringBoot 线程池的实现原理 覆盖默认的线程池 管理多个线程池 JAVA常用的四种线程池 newCachedThreadPool newFixedThreadPool newScheduledThreadPool newSingleThreadExecutor Java 线程池中

    2023年04月11日
    浏览(35)
  • java 线程池的理解与运用,实例支撑

    线程池的定义和特点 线程池是一种多线程处理形式,它可以在程序启动时创建一定数量的线程,并将它们保存在一个线程池中,然后在需要执行任务时,从线程池中取出一个线程来执行任务,任务执行完毕后,线程并不会销毁,而是放回线程池中等待下一次任务的执行。 线

    2024年02月07日
    浏览(33)
  • Java中线程池的使用及原理(附带线程池拒绝策略介绍)

    目录 1.使用线程池的目的 2.线程池的使用及原理 3.生动讲解拒绝策略: 4.自己实现一个简单的线程池 5.线程数的决定方法 6.总结 希望各位大佬能多多点赞关注收藏,有了你们的支持,我也能更有动力的向你们学习不是(手动狗头)!!! 在知道线程池之前,每当我们需要一

    2024年04月17日
    浏览(32)
  • Java并发编程学习18-线程池的使用(下)

    上篇介绍了 ThreadPoolExecutor 配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。 还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。 我们简单回顾下相关的改进过程: 第一次新增时,页

    2024年02月12日
    浏览(33)
  • Java并发编程学习16-线程池的使用(中)

    上篇分析了在使用任务执行框架时需要注意的各种情况,并简单介绍了如何正确调整线程池大小。 本篇将继续介绍对线程池进行配置与调优的一些方法,详细如下: ThreadPoolExecutor 为 Executors 中的 newCachedThreadPool 、 newFixedThreadPool 和 newScheduledThreadExecutor 等工厂方法返回的 Exe

    2024年02月10日
    浏览(38)
  • 从源码全面解析Java 线程池的来龙去脉

    👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主 📕系列专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码系列 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 🍂博主正在努

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包