线程NO.9 线程池
Posted 进击的Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程NO.9 线程池相关的知识,希望对你有一定的参考价值。
图片来自于百度图片
线程池
以上图中的轮渡为例,轮船的个数已定,每天旅游观光的人数不定,人数多就全部出动,人数少,就只需要出动适量的就好了。这个就是我们现实中的线程池。
从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,在工作队列中保存了所有等待执行的任务。在线程池中执行任务比为每一个任务分配一个线程优势更多。通过重用线程来避免线程的大量创建和销毁,同时提高了响应性,避免多个线程竞争资源。
其实要实现一个自定义的线程池很简单,就利用上文讲到的Executor实现一个简单的固定长度线程池,来一个任务创建一个线程。
程序一:自定义固定长度线程池
public class ThreadPool implements Executor{
AtomicInteger size = new AtomicInteger(0);
int count;
LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(100); //任务队列
public ThreadPool(int count) {
this.count = count;
}
@Override
public void execute(Runnable command) {
if(size.getAndIncrement() < count) {
new WorkThread().start();
}
try {
add(command);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void add(Runnable command) throws InterruptedException {
blockingQueue.put(command);
}
class WorkThread extends Thread{
public void run() {
while(true) {
try {
blockingQueue.take().run();;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
ThreadPool tp = new ThreadPool(5);
for(int i=0;i<2000;i++) {
final int m = i;
tp.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+": 执行第"+m+"个任务");
}
});
}
}
}
利用Executors创建线程池
newFixedThreadPool:创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量(如果某个线程由于发生了未预期的异常而结束,那么线程池将会补充一个新线程)。
newCachedThreadPool:创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程。
newSingleThreadExecutor:单线程的Executor,如哦给这个单线程异常结束,将会新建一个线程来替代。
newScheduledThreadPool:创建一个固定长度的线程池,而且以延迟或者定时的方式来执行任务。
由于使用了线程池,不仅可以避免大量的创建线程的情况,更可以利用Executor实现各种调优、管理、监视、记录日志和错误报告等。
下期提要
下期我们将详细介绍每种线程池的具体使用方法。
以上是关于线程NO.9 线程池的主要内容,如果未能解决你的问题,请参考以下文章