线程池概念: 其实就是一个容纳多个线程的容器, 其中的线程可以反复使用, 省去了频繁创建线程对象的操作, 无需反复创建线程而消耗过多的资源.
线程池: 容器 --> 集合 (ArrayList,HashSet,LinkedList<Thread>,HashMap)
当程序第一次启动的时候, 创建多个线程, 保存到一个集合中
当我们想要使用线程的时候, 就可以从集合中取出来线程使用
Thread t = list.remove(0); 返回的是被移除的元素,(线程只能被一个任务使用)
Thread t = linked.removeFist();
当我们使用完毕线程, 需要把线程归还给线程池
- list.add(t);
- linked.addLast(t);
在 JDK1.5 之后, JDK 内置了线程池, 我们可以直接使用
合理利用线程池带来的好处:
降低资源消耗
提高响应速度
提高线程的可管理性.
线程池的代码实现: JDK1.5 之后提供的
java.util.concurrent.Executors; 线程池的工厂类, 用来生成线程池
Executors 类中的静态方法:
static ExecutorService newFixedThreadPool(int nThreads) 创建一个可重用的固定线程数的线程池
参数:
int nTherad: 创建线程池中包含的线程数量
返回值:
ExecutorService 接口, 返回的是 ExecutorService 接口的实现类对象, 我们可以使用 ExecutorService 接口接收 (面向接口编程)
java.util.concurrent.ExecutorService: 线程池接口
用来从线程池中获取线程, 调用 start 方法开启多线程, 执行线程任务
submit(Runnable task) 提交一个 Runnable 任务用于执行
关闭 / 销毁线程池的方法
void shutdown()
线程池的使用步骤:
使用线程池的工厂类 Executors 里边提供的静态方法, newFixedThreadPool 生产一个指定线程数量的线程池
创建一个类, 实现 Runnable 接口, 重写了 run 方法: 用来设置线程任务
调用 ExecutorService 中的方法 submit, 传递线程任务 (实现类), 开启线程, 执行 run 方法.
调用 ExecutorService 中的方法 shotdown 销毁线程池 (不建议执行)
- ExecutorService es = Executors.newFixedThreadPool(2)
- es.submit(new RunnableImpl());// 创建了一个新的线程执行
来源: http://www.bubuko.com/infodetail-3144161.html