java 模拟线程池

来源:互联网 发布:淘宝换货流程明细 编辑:程序博客网 时间:2024/06/13 04:02

前两天从师傅那学了一个模拟线程池的方法,觉得很有用,务必得记录一下。

首先说一下对线程池的理解及它的优点:

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多

资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所

以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象

创建和销毁。

那么,线程池的优点:

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

第三:提高线程的可管理性。

 

接下来通过代码演示线程池,我们从创建任务开始,将任务分配到线程池中执行这些任务。

首先创建一个任务类,

package ThreadPool;/** * @author 赵玺 *用runnable线程创建任务 */public class Task implements Runnable{//重写run方法public void run() {//获取当前可执行线程的名字String name = Thread.currentThread().getName();System.out.println(name+"任务正在执行中......");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name+"任务执行完毕");}}

 

模拟线程池,

package ThreadPool;import java.util.List;import java.util.ArrayList;/** * 线程池的实现 * @author 赵玺 * @param <ThreadWorker> * */public class ThreadPool{//初始化线程数量private int count;//保存工作的线程数组private ThreadWorker[] pool;//保存任务的队列private List<Runnable> task_list = new ArrayList<Runnable>();public ThreadPool(int count){this.count = count;pool = new ThreadWorker[this.count];for(int i=0;i<this.count;i++){ThreadWorker worker = new ThreadWorker();pool[i] = worker;pool[i].setName(i+"号线程");pool[i].start();System.out.println("第"+pool[i].getName()+"已就绪,等待执行任务。。。");}System.out.println("线程初始化完毕");}//执行任务public void execute(Runnable task){synchronized(task_list){//添加到任务队列task_list.add(task);//通知task_list.notify();}}//工作线程类private class ThreadWorker extends Thread{public void run(){Runnable r;while(true){synchronized(task_list){if(task_list.isEmpty()){//任务队列中没有任务,等待try {task_list.wait();//等待} catch (InterruptedException e) {e.printStackTrace();}}//有任务,执行r = task_list.remove(0);}r.run();//执行}}}//主方法public static void main(String[] args) {//创建一个线程池对象ThreadPool threadpool = new ThreadPool(5);//创建20个任务对象for(int i=0;i<20;i++){Task task = new Task();threadpool.execute(task);}}}

 

系统线程池,

package ThreadPool;/** * 测试类 * 使用系统的线程池 */import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Test {//主方法public static void main(String[] args) {//创建一个固定线程集合的线程池ExecutorService pool = Executors.newFixedThreadPool(5);//创建20个任务for(int i=0;i<20;i++){Task task = new Task();pool.execute(task);}//启动一次顺序关闭线程池pool.shutdown();}}

 

模拟线程池执行结果:

第0号线程已就绪,等待执行任务。。。
第1号线程已就绪,等待执行任务。。。
第2号线程已就绪,等待执行任务。。。
第3号线程已就绪,等待执行任务。。。
第4号线程已就绪,等待执行任务。。。
线程初始化完毕
0号线程任务正在执行中......
4号线程任务正在执行中......
1号线程任务正在执行中......
2号线程任务正在执行中......
3号线程任务正在执行中......
0号线程任务执行完毕
0号线程任务正在执行中......
2号线程任务执行完毕
2号线程任务正在执行中......
4号线程任务执行完毕
4号线程任务正在执行中......
3号线程任务执行完毕
3号线程任务正在执行中......
1号线程任务执行完毕
1号线程任务正在执行中......
0号线程任务执行完毕
0号线程任务正在执行中......
4号线程任务执行完毕
4号线程任务正在执行中......
3号线程任务执行完毕
3号线程任务正在执行中......
1号线程任务执行完毕
1号线程任务正在执行中......
2号线程任务执行完毕
2号线程任务正在执行中......
0号线程任务执行完毕
0号线程任务正在执行中......
3号线程任务执行完毕
4号线程任务执行完毕
4号线程任务正在执行中......
2号线程任务执行完毕
2号线程任务正在执行中......
3号线程任务正在执行中......
1号线程任务执行完毕
1号线程任务正在执行中......
0号线程任务执行完毕
1号线程任务执行完毕
3号线程任务执行完毕
4号线程任务执行完毕
2号线程任务执行完毕

 

系统线程池执行结果:
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务正在执行中......
pool-1-thread-2任务正在执行中......
pool-1-thread-4任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-3任务执行完毕
pool-1-thread-5任务执行完毕
pool-1-thread-4任务执行完毕
pool-1-thread-2任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务正在执行中......
pool-1-thread-2任务正在执行中......
pool-1-thread-4任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-3任务执行完毕
pool-1-thread-5任务执行完毕
pool-1-thread-4任务执行完毕
pool-1-thread-2任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务正在执行中......
pool-1-thread-2任务正在执行中......
pool-1-thread-4任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-1任务正在执行中......
pool-1-thread-3任务执行完毕
pool-1-thread-3任务正在执行中......
pool-1-thread-5任务执行完毕
pool-1-thread-5任务正在执行中......
pool-1-thread-4任务执行完毕
pool-1-thread-4任务正在执行中......
pool-1-thread-2任务执行完毕
pool-1-thread-2任务正在执行中......
pool-1-thread-1任务执行完毕
pool-1-thread-3任务执行完毕
pool-1-thread-5任务执行完毕
pool-1-thread-4任务执行完毕
pool-1-thread-2任务执行完毕

从结果可以看出模拟的线程池也能达到效果。

模拟线程池的核心是ThreadWorker类,在线城池初始化完毕后,只需在execute()方法中给任务队列加上

synchornized同步锁即可。

在这里分析一下newFixedThreadPool()方法,下面是api上的解释:

newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。

FixedThreadPool
是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销
的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程
,还会占用一定的系统资源。

但在这里得说一下shutdown()方法:启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经

关闭,则调用没有其他作用。所以,用系统地线程池调用shutdown()方法之后会关闭线程池,而模拟的线程池不会。