5.4 线程池

线程池是一种管理线程的资源,它可以在系统中创建、重用和销毁线程。线程池的主要优点是减少了创建和销毁线程的开销,提高了系统的性能。

Java中的线程池由java.util.concurrent.ExecutorService接口和它的实现类表示。ExecutorService提供了一些用于管理线程池的方法,如submit()execute()shutdown()等。

5.3.1 创建线程池

Java提供了几种创建线程池的方法:

  • Executors.newFixedThreadPool(int nThreads): 创建一个固定大小的线程池,最多可以同时运行nThreads个线程。
  • Executors.newCachedThreadPool(): 创建一个可缓存的线程池,如果线程池的当前大小超过处理需求,则回收空闲的线程;如果需要额外线程,则创建新线程。
  • Executors.newSingleThreadExecutor(): 创建一个只有一个线程的线程池。
  • Executors.newScheduledThreadPool(int corePoolSize): 创建一个可以定时执行任务的线程池。

5.3.2 使用线程池

我们可以使用ExecutorServicesubmit()execute()方法将任务提交给线程池。这些任务通常是实现java.lang.Runnable接口或java.util.concurrent.Callable接口的类的实例。

Runnable接口的任务没有返回值,而Callable接口的任务可以返回一个值。如果任务是Callable实例,我们可以使用submit()方法提交任务,并获得一个java.util.concurrent.Future实例,该实例表示任务的结果。

示例:使用线程池执行任务

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 使用execute()方法提交Runnable任务
        for (int i = 0; i < 5; i++) {
            executor.execute(new RunnableTask(i));
        }

        // 使用submit()方法提交Callable任务
        Future<Integer> future = executor.submit(new CallableTask());
        try {
            System.out.println("CallableTask的结果: " + future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        executor.shutdown();
    }
}

class RunnableTask implements Runnable {
    private int taskId;

    public RunnableTask(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("RunnableTask " + taskId + " is running.");
    }
}

class CallableTask implements Callable<Integer> {
    @Override
    public Integer call() {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}

在上述示例中,我们创建了一个固定大小的线程池,并提交了5个Runnable任务和1个Callable任务。我们还使用Future实例获取了Callable任务的结果。

5.3.3 关闭线程池

当我们不再需要线程池时,应该将其关闭。可以使用ExecutorServiceshutdown()方法或shutdownNow()方法关闭线程池。shutdown()方法会等待所有已提交的任务完成,而shutdownNow()方法会尝试立即停止所有正在执行的任务。

小结

在本章节,我们讨论了Java多线程与并发的“5.3 线程池”。我们了解了如何创建线程池、如何使用线程池执行任务以及如何关闭线程池。线程池是Java并发编程中的重要概念,可以帮助我们更有效地管理线程资源,提高程序性能。

请务必多加实践,以便更好地掌握这些知识点。祝你学习顺利!
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

热门相关:首席的独宠新娘   最强反套路系统   夫人,你马甲又掉了!   特工重生:快穿全能女神   夫人,你马甲又掉了!