java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java创建线程池

Java中创建线程池的几种方式以及区别

作者:The-Venus

创建线程池有多种方式,主要通过 Java 的 java.util.concurrent 包提供的 Executors 工具类来实现,本文给大家介绍了几种常见的线程池类型及其区别,并通过代码示例讲解的非常详细,需要的朋友可以参考下

1. FixedThreadPool

//创建一个固定大小的线程池,模拟提交 10 个任务到线程池。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); // 创建一个具有3个线程的固定线程池
        
        for (int i = 1; i <= 10; i++) {
            final int task = i;
            fixedThreadPool.execute(() -> {
                System.out.println("执行任务 " + task + ",线程:" + Thread.currentThread().getName());
            });
        }
        
        fixedThreadPool.shutdown();
    }
}

2. CachedThreadPool

//创建一个缓存线程池来处理任务,模拟并发执行 10 个任务

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

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        
        for (int i = 1; i <= 10; i++) {
            final int task = i;
            cachedThreadPool.execute(() -> {
                System.out.println("执行任务 " + task + ",线程:" + Thread.currentThread().getName());
            });
        }
        
        cachedThreadPool.shutdown();
    }
}

3. SingleThreadExecutor

//创建一个单线程线程池,顺序执行多个任务。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        
        for (int i = 1; i <= 5; i++) {
            final int task = i;
            singleThreadExecutor.execute(() -> {
                System.out.println("执行任务 " + task + ",线程:" + Thread.currentThread().getName());
            });
        }
        
        singleThreadExecutor.shutdown();
    }
}

4. ScheduledThreadPool

//创建一个支持定时和周期性执行任务的线程池,示例任务每隔 2 秒执行一次,共执行 3 次。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2); // 创建一个有2个线程的定时线程池
        
        scheduledThreadPool.scheduleAtFixedRate(() -> {
            System.out.println("定时任务执行,线程:" + Thread.currentThread().getName());
        }, 0, 2, TimeUnit.SECONDS); // 0秒延迟后开始,每隔2秒执行一次任务
        
        // 程序运行5秒后关闭线程池
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        scheduledThreadPool.shutdown();
    }
}

5. WorkStealingPool(Java 8 引入)

//创建一个基于任务分解的线程池来并行执行多个任务,适合处理需要拆分的小任务。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class WorkStealingPoolExample {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService workStealingPool = Executors.newWorkStealingPool(); // 创建默认线程数为CPU核心数的工作窃取线程池
        
        for (int i = 1; i <= 8; i++) {
            final int task = i;
            workStealingPool.submit(() -> {
                System.out.println("执行任务 " + task + ",线程:" + Thread.currentThread().getName());
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        
        // 让主线程等待子任务执行完成
        workStealingPool.awaitTermination(3, TimeUnit.SECONDS);
        workStealingPool.shutdown();
    }
}

区别总结

线程池类型线程数量控制特点适用场景
FixedThreadPool固定数量固定线程数,适合稳定的任务并发固定并发任务
CachedThreadPool自动扩展动态扩展,空闲线程自动回收,适合任务短小但并发量不稳定短期的异步并发任务
SingleThreadExecutor单一线程单线程顺序执行任务,保证顺序顺序执行的任务
ScheduledThreadPool可控核心线程数支持定时或周期性任务定时任务、周期性任务
WorkStealingPool默认 CPU 核数基于任务拆分并行处理,提高多核 CPU 利用率并行计算和多任务的分解

以上就是Java中创建线程池的几种方式以及区别的详细内容,更多关于Java创建线程池的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文