线程池

线程池:

?一、线程池:

?用我的话来说,现在有很多线程任务要执行,比如很多人同时访问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():



?

?七、总结:

使用线程池,不是很占我的内存,运行速度快,一次可以处理多个任务.

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。