欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程池

程序员文章站 2022-05-06 07:52:58
...

线程池:

 一、线程池:

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


线程池
 

 七、总结:

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