关于人工智能:54-线程池

线程池是一种治理线程的资源,它能够在零碎中创立、重用和销毁线程。线程池的次要长处是缩小了创立和销毁线程的开销,进步了零碎的性能。

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理