Java中线程池的使用

简介: Java中线程池的使用

文章目录

线程池

线程池主要用于控制运行的线程的数量。主要特点:线程复用,控制并发数,管理线程。

线程池的组成

  1. 线程池管理器:用于创建并管理线程池。
  2. 工作线程:线程池中的线程
  3. 任务接口: 每个任务必须实现的接口,用于工作线程调度其运行
  4. 任务队列:用于存放待处理的任务,提供一种缓冲机制。

创建线程池的几种方法

Java中创建线程池是通过Executors来进行创建。

  1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回
    收空闲线程,若无可回收,则新建线程。

public static ExecutorService newCachedThreadPool() {

       return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

                                     60L, TimeUnit.SECONDS,

                                     new SynchronousQueue<Runnable>());

   }

例子:

//1.newCachedThreadPool创建一个可缓存线程池,如果当前线程池的长度超过了处理的需要

       //时,它可以灵活的回收空闲的线程,当需要增加时, 它可以灵活的添加新的线程,而不会对池的

       //长度作任何限制

       // 创建无限大小线程池,由jvm自动回收

       ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();

       for (int i = 0; i < 10; i++) {

           newCachedThreadPool.execute(new Runnable() {

               public void run() {

                   try {

                       Thread.sleep(100);

                   } catch (Exception e) {

                   }

                   System.out.println("可缓存线程池"+Thread.currentThread().getName());

               }

           });

       }

  1. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列
    中等待。

   public static ExecutorService newFixedThreadPool(int nThreads) {

       return new ThreadPoolExecutor(nThreads, nThreads,

                                     0L, TimeUnit.MILLISECONDS,

                                     new LinkedBlockingQueue<Runnable>());

   }

例子:

 //2.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);

for (int i = 0; i < 10; i++) {

newFixedThreadPool.execute(new Runnable() {

public void run() {

                   System.out.println("定长线程池"+Thread.currentThread().getName());

               }

           });

       }

  1. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

public static ScheduledExecutorService newScheduledThreadPool(

int corePoolSize, ThreadFactory threadFactory) {

返回新的 ScheduledThreadPoolExecutor(corePoolSize, threadFactory);

   }

例子

//3.创建一个固定长度的线程池

       //定义线程池大小为3

ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);

for (int i = 0; i < 10; i++) {

最终整数温度 = i;

newScheduledThreadPool.schedule(new Runnable() {

public void run() {

                   System.out.println("固定长度的线程池"+Thread.currentThread().getName());

               }

           }, 3, TimeUnit.SECONDS);//这里表示延迟3秒执行。

       }

4.创建一个单线程化的线程池,它只会用唯一的工作线程来执行任newSingleThreadExecutor

务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

public static ExecutorService newSingleThreadExecutor() {

返回新的可完成委派执行器服务

(new ThreadPoolExecutor(1, 1,

0L, 时间单位.毫秒,

new LinkedBlockingQueue<Runnable>()));

   }

例子

//4.创建一个单线程化的线程池

ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();

for (int i = 0; i < 10; i++) {

newSingleThreadExecutor.execute(new Runnable() {

public void run() {

                   System.out.println("单线程化的线程池"+Thread.currentThread().getName());

尝试 {

线程睡眠(200);

} catch (Exception e) {

                   }

               }

           });

       }

自定义线程池

使用ThreadPoolExecutor自定义线程池,提供构造函数。

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

长保持活力时间,

时间单位,

BlockingQueue<Runnable> workQueue) {

this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

Executors.defaultThreadFactory(), defaultHandler);

   }

构造函数参数的含义:

corePoolSize 核心线程数量

maximumPoolSize 最大线程数量

keepAliveTime 线程保持时间,N个时间单位

unit 时间单位(比如秒,分)

workQueue 阻塞队列

threadFactory 线程工厂

handler 线程池拒绝策略

例子

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 60L,

TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));

for (int i = 1; i <= 10; i++) {

executor.execute(new Runnable() {

@Override

public void run() {

System.out.println(Thread.currentThread().getName());

                }

            }); //是执行线程方法

       }

       executor.shutdown() ;//不再接受新的任务,并且等待之前提交的任务都执行完再关闭,阻塞队列中的任务不会再执行。

   }


相关文章
|
3天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
21 0
|
1天前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
|
1天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
2天前
|
缓存 Java
【Java基础】简说多线程(上)
【Java基础】简说多线程(上)
6 0
|
2天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
2天前
|
安全 Java 编译器
是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
本文简要介绍了Java中的`synchronized`关键字,它是用于保证多线程环境下的同步,解决原子性、可见性和顺序性问题。从JDK1.6开始,synchronized进行了优化,性能得到提升,现在仍可在项目中使用。synchronized有三种用法:修饰实例方法、静态方法和代码块。文章还讨论了synchronized修饰代码块的锁对象、静态与非静态方法调用的互斥性,以及构造方法不能被同步修饰。此外,通过反汇编展示了`synchronized`在方法和代码块上的底层实现,涉及ObjectMonitor和monitorenter/monitorexit指令。
15 0
|
2天前
|
监控 安全 Java
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
10 2
|
2天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
28 1
|
2天前
|
安全 Java
Java基础教程(15)-多线程基础
【4月更文挑战第15天】Java内置多线程支持,通过Thread类或Runnable接口实现。线程状态包括New、Runnable、Blocked、Waiting、Timed Waiting和Terminated。启动线程调用start(),中断线程用interrupt(),同步用synchronized关键字。线程安全包如java.util.concurrent提供并发集合和原子操作。线程池如ExecutorService简化任务管理,Callable接口允许返回值,Future配合获取异步结果。Java 8引入CompletableFuture支持回调。
|
3天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。