在使用线程的时候就去创建一个线程 这样实现起来非常简便 但有一个问题:
如果并发的线程数量很多 并且每个线程都是执行一个时间很短的任务就结束了 这样频繁创建线程就会大大降低系统的效率 因为频繁创建线程和销毁线程需要时间
有一种办法 可以使得线程可以复用 线程在执行完一个任务并不被销毁 而是可以继续执行其他的任务
在Java中可以通过线程池来达到这样的效果

一、概念

线程池:顾名思义 像一个池子 其实就是一个容纳多个线程的容器 其中的线程可以反复使用
省去了频繁创建线程对象的操作 无需反复创建线程而消耗过多资源

线程池就是一个集合 里面存放的就是一个个线程(Thread)

原理:

在这里插入图片描述
当程序第一次启动的时候就创建了多个线程 并保存到一个集合
当想要使用线程的时候 就可以从这个集合中取出线程来使用
arraylist.remove(0) 取第一个线程 返回被移除的元素(线程只能被一个任务使用)
或linkedlist.removeFirst()

当使用完线程 需要将线程还给线程池
arraylist.add(thread)或linkedlist.addLast(thread)

在JDK1.5之后 内置了线程池 可供直接使用

线程池的优点:

  1. 降低资源消耗
    减少了创建和销毁线程的次数 每个工作线程都可以被重复利用 可执行多个任务
  2. 提高响应速度
    当任务到达时 任务可以不需要的等到线程创建就能立即执行
  3. 提高线程的可管理性
    可以根据系统的承受能力来调整线程池中工作线线程的数目 防止因为消耗过多的内存而把服务器累趴下
    (每个线程需要大约1MB内存 线程开的越多 消耗的内存也就越大 最后可能导致死机)

二、代码实现

Java里面线程池的顶级接口是 java.util.concurrent.Executor 它是线程池的工厂类
因此 严格意义上讲 Executor 并不是一个线程池 而只是一个执行线程的工具
真正的线程池接口是 java.util.concurrent.ExecutorService

创建线程池的方法:
ExecutorService newFixedThreadPool(int nThreads)返回线程池对象
(此方法创建的是有界线程池,也就是池中的线程个数可以指定最大数量)

  • 参数:创建的线程池中包含的线程数量
  • 返回值:ExecutorService接口的实现类对象 可以使用ExecutorService接口接收(面向接口的编程思想)

那么 获取到了一个线程池ExecutorService 对象该如何使用呢?
public Future<?> submit(Runnable task) :获取线程池中的某一个线程对象 调用start()方法执行线程任务

  • 返回值:Future接口:用来记录线程任务执行完毕后产生的结果

void shutdown() 关闭线程池

使用步骤:

  1. 创建线程池对象
  2. 创建Runnable接口子类对象 重写run()方法 设置线程任务(task)
  3. 提交Runnable接口子类对象 传递线程任务 开启线程
  4. 关闭线程池(可选 线程池关闭后就无法使用里面的线程了)

线程类:

public class RunnableImpl implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"测试任务");
    }
}

主类:

public class ThreadPool {
    public static void main(String[] args) {
    	// 创建一个里面有2个线程的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 线程池会一直开启 使用完了线程就会自动归还给线程池 线程可以继续使用
        executorService.submit(new RunnableImpl());
        executorService.submit(new RunnableImpl());
        executorService.submit(new RunnableImpl());
        executorService.submit(new RunnableImpl());

        // executorService.shutdown();
    }
}

GitHub 加速计划 / th / ThreadPool
7.74 K
2.22 K
下载
A simple C++11 Thread Pool implementation
最近提交(Master分支:2 个月前 )
9a42ec13 - 9 年前
fcc91415 - 9 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐