Java线程池的简单使用方法实例教程

 更新时间:2021年10月05日 11:24:30   作者:随身电源  
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的,在jdk1.5之后这一情况有了很大的改,这篇文章主要给大家介绍了关于Java线程池的简单使用方法,需要的朋友可以参考下

线程池使用场景?

java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。java中涉及到线程池的相关类均在jdk1.5开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。

 Java线程池使用

对于资源池的技术,相信大家早就接触过,比如数据库连接池,常见的有c3p0、dbcp等等,而线程也有对应的池子,称为线程池。

Java提供了Executors类来创建一个线程池,如:

public static void main(String[] args) {
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    Thread thread = new Thread(() -> {
        System.out.println("hello world!");
    });
    executorService.execute(thread);
}

通过newFixedThreadPool()方法可以获得一个指定线程数的线程池。

又如:

public static void main(String[] args) {
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    Thread thread = new Thread(() -> {
        System.out.println("hello world!");
    });
    executorService.execute(thread);
}

通过newSingleThreadExecutor()方法可以获得一个线程数为1的线程池。

还有:

public static void main(String[] args) {
    ExecutorService executorService = Executors.newCachedThreadPool();
    Thread thread = new Thread(() -> {
        System.out.println("hello world!");
    });
    executorService.execute(thread);
}

通过newCachedThreadPool()方法可以获得一个根据需要创建线程的线程池,它会根据任务数创建对应数量的线程。

我们发现,通过Executors类能够创建各式各样的线程池,但阿里巴巴Java开发手册并不推荐我们使用Executors类的方式创建线程,而是要自己手动创建:

那如何手动创建线程池呢?

public static void main(String[] args) {
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            5,
            10,
            5L,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(3),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.CallerRunsPolicy());
    executor.execute(() -> {
        System.out.println("hello world");
    });
}

构造ThreadPoolExecutor对象即可得到一个线程池,但需要指定七个参数,分别如下:

  1. corePoolSize:核心线程数
  2. maximumPoolSize:最大线程数
  3. keepAliveTime:空闲时间
  4. unit:空闲时间单位
  5. workQueue:任务队列
  6. threadFactory:创建线程的工厂
  7. handler:饱和策略

其中核心线程数表示线程池中最核心的线程,它们在任何情况下都不会被回收,而是等待任务的到来,最大线程数是线程池能够创建的最大线程数,空闲时间表示某个非核心线程在等待空闲时间后仍然没有任务执行,该线程便会被回收,创建线程的工厂用于指定创建线程的方式,一般默认即可,饱和策略表示当线程池达到最大线程数后,超出的任务应该如何进行处理。

举一个简单的例子,现在有10个任务等待执行,因为我们的核心线程数为5,所以线程池会先创建5个线程用于执行其中的5个任务,剩下的5个任务会被放入任务队列,而任务队列的容量只有3,所以任务队列只能够放下3个任务,剩下的2个任务无法放入队列,线程池就会创建2个非核心线程用于执行它们,若是此时线程池中的线程数达到了最大线程数,则会触发饱和策略,比如这里的CallerRunsPolicy策略,它将直接丢弃掉新的任务。

总结

到此这篇关于Java线程池的简单使用的文章就介绍到这了,更多相关Java线程池使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java五种方式实现多线程循环打印问题

    Java五种方式实现多线程循环打印问题

    本文主要介绍了Java五种方式实现多线程循环打印问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  •  Java图形化界面编程实现简单计算器

     Java图形化界面编程实现简单计算器

    这篇文章主要介绍了Java图形化界面编程实现简单计算器,下面文章围绕Java图形化界面编程实现简单计算器的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-01-01
  • java 完全二叉树的构建与四种遍历方法示例

    java 完全二叉树的构建与四种遍历方法示例

    本篇文章主要介绍了java 完全二叉树的构建与四种遍历方法示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • java批量插入数据的几种方法

    java批量插入数据的几种方法

    这篇文章主要给大家介绍了关于java批量插入数据的几种方法,大家在Java项目中经常会出现大量向数据库中插入的情况,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Java中如何将json字符串转换成map/list

    Java中如何将json字符串转换成map/list

    这篇文章主要介绍了Java中如何将json字符串转换成map/list,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot整合ShardingSphere的示例代码

    SpringBoot整合ShardingSphere的示例代码

    本文主要介绍了SpringBoot整合ShardingSphere的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java时间类Date类和Calendar类的使用详解

    Java时间类Date类和Calendar类的使用详解

    这篇文章主要介绍了Java时间类Date类和Calendar类的使用详解,需要的朋友可以参考下
    2017-08-08
  • Springmvc自定义类型转换器实现步骤

    Springmvc自定义类型转换器实现步骤

    这篇文章主要介绍了Springmvc自定义类型转换器实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot2 集成log4j2日志框架的实现

    SpringBoot2 集成log4j2日志框架的实现

    这篇文章主要介绍了SpringBoot2 集成log4j2日志框架的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • MyBatis-Plus条件构造器Wrapper应用实例

    MyBatis-Plus条件构造器Wrapper应用实例

    QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件,这篇文章主要介绍了MyBatis-Plus数据表操作条件构造器Wrapper,需要的朋友可以参考下
    2023-09-09

最新评论