Go vs Java线程池
定义
- 线程池(Thread Pool)是一种多线程编程中的资源管理技术,它预先创建一定数量的线程,并将它们放在一个池(pool)中待命。
- 当有新的任务需要执行时,线程池会选择一个空闲线程来执行任务,而不是每次都创建新的线程。
- 使用线程池的主要目的是为了减少线程的创建和销毁所带来的系统开销,提高系统性能,并更好地控制系统资源。
Java
工具类线程池实现
-
方法名称 说明 public static ExecutorService newCachedThreadPool()
创建一个没有上限的线程池(创建上限是int的最大值 public static ExecutorService newFixedThreadPool(int nThreads)
创建指定线程个数的线程池 Executors
:线程池的工具类通过调用方法返回不同类型的线程池对象。
-
工具类代码步骤
- 创建线程池:
ExecutorService pool = Executors.newCachedThreadPool();
- 提交任务:
pool.submit(new MyThread());
,submit的对象是实现线程类的类 - 销毁线程池:
pool.shutdown();
- 创建线程池:
-
代码
public class Main { public static void main(String[] args){ //创建线程池 ExecutorService pool = Executors.newFixedThreadPool(3); //提交任务 pool.submit(new MyThread()); pool.submit(new MyThread()); pool.submit(new MyThread()); pool.submit(new MyThread()); pool.submit(new MyThread()); //销毁线程池 pool.shutdown(); } }
自定义线程池
线程池的设计思路
线程池的思路和生产者消费者模型是很接近的
- 准备一个任务容器
- 一次性启动多个(2个)消费者线程
- 刚开始任务容器是空的,所以线程都在wait
- 直到一个外部线程向这个任务容器中扔了一个"任务",就会有一个消费者线程被唤醒
- 这个消费者线程取出"任务",并且执行这个任务,执行完毕后,继续等待下一次任务的到来
在整个过程中,都不需要创建新的线程,而是循环使用这些已经存在的线程。
代码实现
实现思路:
- 创建一个线程池类(ThreadPool)
- 在该类中定义两个成员变量poolSize(线程池初始化线程的个数) , BlockingQueue(任务容器)
- 通过构造方法来创建两个线程对象(消费者线程),并且启动
- 使用内部类的方式去定义一个线程类(TaskThread),可以提供一个构造方法用来初始化线程名称
- 两个消费者线程需要不断的从任务容器中获取任务,如果没有任务,则线程处于阻塞状态。
- 提供一个方法(submit)向任务容器中添加任务
- 定义测试类进行测试
线程池类
public class ThreadPool {
// 初始化线程个数
private static final int DEFAULT_POOL_SIZE = 2 ;
// 在该类中定义两个成员变量poolSize(线程池初始化线程的个数) , BlockingQueue<Runnable>(任务容器)
private int poolSize = DEFAULT_POOL_SIZE ;
private BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>() ;
// 无参构造方法
public ThreadPool(){
this.initThread();
}
// 有参构造方法,通过构造方法来创建两个线程对象(消费者线程),并且启动
public ThreadPool(int poolSize) {
if(poolSize > 0) {
this