线程池
线程池:
?一、线程池:
?用我的话来说,现在有很多线程任务要执行,比如很多人同时访问ITeye,这是,总不能来一个用户,就new一个线程去来接待用户吧,线程池就是预先创建了很多线程(用来处理任务线程的),当有任务需要执行时,就取出线程对象执行任务,执行完毕后,并不销毁(等待JVM回收)线程对象,而是将其放入一个集合中,等待下一次任务的执行
?
?二、简单实现:
?1.任务线程
package 线程池; /** * 运行的线程任务 * @author Administrator * */ public class RunThreadTask implements Runnable { String name; public void SetName(String name){ this.name =name; } public String getName(){ return name; } @Override public void run() { // TODO Auto-generated method stub String name1 = Thread.currentThread().getName(); try{ while(true){ System.out.println("当前运行的任务线程是:"+name+"<>"+"线程:"+name1); Thread.sleep(3000); } }catch(Exception ef){ System.out.println("异常中断"); } System.out.println("执行完毕"); } }
?
?2.线程池:
package 线程池; import java.util.LinkedList; /** * 用线程池去管理 正在运行的线程任务 * @author Administrator * */ public class MyThreadPool { private int theCountOfThreadPool;//线程池的大小 private LinkedList theListOfRunThreadTask;//保存运行的线程任务的List private theThreadOfThreadPool[] theListOfThreadPool;//用来处理线程任务的List public void execute(RunThreadTask runTask){ synchronized (theListOfRunThreadTask) { theListOfRunThreadTask.addLast(runTask); theListOfRunThreadTask.notify(); System.out.println("加入了一个任务"+runTask.getName()); } } public static void main(String[] args) { MyThreadPool cb123456 = new MyThreadPool(10); RunThreadTask[] task = new RunThreadTask[20]; //theListOfRunThreadTask = LinkedList<RunThreadTask>; for (int i = 0; i < 20; i++) { task[i]= new RunThreadTask(); task[i].SetName("任务EE"+i); //task[i].getName(); //System.out.println("xxxx"+i); //task[i].run(); cb123456.execute(task[i]); } } public MyThreadPool(int count){ this.theCountOfThreadPool = count; theListOfRunThreadTask = new LinkedList(); //定义线程池的大小 theListOfThreadPool = new theThreadOfThreadPool[theCountOfThreadPool]; for (int i = 0; i < theListOfThreadPool.length; i++) { //初始化每一个线程 theListOfThreadPool[i] = new theThreadOfThreadPool(); theListOfThreadPool[i].setName(i+"号线程WWW"); theListOfThreadPool[i].start(); System.out.println(i+"号线程已经创建,等待任务"); } System.out.println("线程池初初始化完毕"); } public class theThreadOfThreadPool extends Thread{ @Override public void run() { // TODO Auto-generated method stub //super.run(); RunThreadTask r; while(true){ synchronized (theListOfRunThreadTask) { while(theListOfRunThreadTask.isEmpty()){ try{ theListOfRunThreadTask.wait(); }catch(InterruptedException ef){ } } //收到通知时,执行线程 r= (RunThreadTask) theListOfRunThreadTask.removeLast(); //此时r就是正在运行的线程任务; } //接着在让r对象run一下. r.run(); } } } }
?
?三、运行结果:
?
?
?四、执行流程:
? 通过构造函数,我们在线程池内创建了接待任务的线程,并让接待任务线程run起来,然后通过RunThreadTask[],创建任务线程对象,每次创建一个就让线程池去处理,再让任务线程run起来.大概就是这么个流程
?
?五、结果分析:
?按照湖南的话来说,就是每次显示都是一大坨,呵,就是每一毫秒,都会同时执行很多任务的.内存也不会飚到很高的。
?
?六、补充:
Thread.currentThread():
?
?七、总结:
使用线程池,不是很占我的内存,运行速度快,一次可以处理多个任务.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。