创建Java线程池

 

  • 博客分类:
  • Java

线程池的作用:

     线程池作用就是限制系统中执行线程的数量。
     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

 

为什么要用线程池:

  1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

线程池类

    

Java代码 复制代码  收藏代码
  1. package com.tdt.impl.ls;   
  2.   
  3. import java.util.LinkedList;   
  4.   
  5. /**  
  6.  * @project LocationGateway  
  7.  * @author sunnylocus     
  8.  * @verson 1.0.0  
  9.  * @date   Aug 2, 2008  
  10.  * @jdk    1.4.2  
  11.  */  
  12. public class ThreadPool extends ThreadGroup {   
  13.     private boolean isClosed = false;  //线程池是否关闭   
  14.     private LinkedList workQueue;      //工作队列  
  15.     private static int threadPoolID = 1;  //线程池的id  
  16.     public ThreadPool(int poolSize) {  //poolSize 表示线程池中的工作线程的数量  
  17.   
  18.         super(threadPoolID + "");      //指定ThreadGroup的名称  
  19.         setDaemon(true);               //继承到的方法,设置是否守护线程池  
  20.         workQueue = new LinkedList();  //创建工作队列  
  21.         for(int i = 0; i < poolSize; i++) {   
  22.             new WorkThread(i).start();   //创建并启动工作线程,线程池数量是多少就创建多少个工作线程  
  23.         }   
  24.     }   
  25.        
  26.     /** 向工作队列中加入一个新任务,由工作线程去执行该任务*/  
  27.     public synchronized void execute(Runnable task) {   
  28.         if(isClosed) {   
  29.             throw new IllegalStateException();   
  30.         }   
  31.         if(task != null) {   
  32.             workQueue.add(task);//向队列中加入一个任务  
  33.             notify();           //唤醒一个正在getTask()方法中待任务的工作线程  
  34.         }   
  35.     }   
  36.        
  37.     /** 从工作队列中取出一个任务,工作线程会调用此方法*/  
  38.     private synchronized Runnable getTask(int threadid) throws InterruptedException {   
  39.         while(workQueue.size() == 0) {   
  40.             if(isClosed) return null;   
  41.             System.out.println("工作线程"+threadid+"等待任务...");   
  42.             wait();             //如果工作队列中没有任务,就等待任务  
  43.         }   
  44.         System.out.println("工作线程"+threadid+"开始执行任务...");   
  45.         return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除  
  46.     }   
  47.        
  48.     /** 关闭线程池 */  
  49.     public synchronized void closePool() {   
  50.         if(! isClosed) {   
  51.             waitFinish();        //等待工作线程执行完毕  
  52.             isClosed = true;   
  53.             workQueue.clear();  //清空工作队列   
  54.             interrupt();        //中断线程池中的所有的工作线程,此方法继承自ThreadGroup类  
  55.         }   
  56.     }   
  57.        
  58.     /** 等待工作线程把所有任务执行完毕*/  
  59.     public void waitFinish() {   
  60.         synchronized (this) {   
  61.             isClosed = true;   
  62.             notifyAll();            //唤醒所有还在getTask()方法中等待任务的工作线程  
  63.         }   
  64.         Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。  
  65.         int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程  
  66.         for(int i =0; i < count; i++) { //等待所有工作线程结束  
  67.             try {   
  68.                 threads[i].join();  //等待工作线程结束  
  69.             }catch(InterruptedException ex) {   
  70.                 ex.printStackTrace();   
  71.             }   
  72.         }   
  73.     }   
  74.   
  75.     /**  
  76.      * 内部类,工作线程,负责从工作队列中取出任务,并执行  
  77.      * @author sunnylocus  
  78.      */  
  79.     private class WorkThread extends Thread {   
  80.         private int id;   
  81.         public WorkThread(int id) {   
  82.             //父类构造方法,将线程加入到当前ThreadPool线程组中  
  83.             super(ThreadPool.this,id+"");   
  84.             this.id =id;   
  85.         }   
  86.         public void run() {   
  87.             while(! isInterrupted()) {  //isInterrupted()方法继承自Thread类,判断线程是否被中断  
  88.                 Runnable task = null;   
  89.                 try {   
  90.                     task = getTask(id);     //取出任务  
  91.                 }catch(InterruptedException ex) {   
  92.                     ex.printStackTrace();   
  93.                 }   
  94.                 //如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程  
  95.                 if(task == nullreturn;   
  96.                    
  97.                 try {   
  98.                     task.run();  //运行任务   
  99.                 }catch(Throwable t) {   
  100.                     t.printStackTrace();   
  101.                 }   
  102.             }//  end while   
  103.         }//  end run   
  104.     }// end workThread   
  105. }  
package com.tdt.impl.ls;

import java.util.LinkedList;

/**
 * @project LocationGateway
 * @author sunnylocus	
 * @verson 1.0.0
 * @date   Aug 2, 2008
 * @jdk    1.4.2
 */
public class ThreadPool extends ThreadGroup {
	private boolean isClosed = false;  //线程池是否关闭 
	private LinkedList workQueue;      //工作队列
	private static int threadPoolID = 1;  //线程池的id
	public ThreadPool(int poolSize) {  //poolSize 表示线程池中的工作线程的数量

		super(threadPoolID + "");      //指定ThreadGroup的名称
		setDaemon(true);               //继承到的方法,设置是否守护线程池
		workQueue = new LinkedList();  //创建工作队列
		for(int i = 0; i < poolSize; i++) {
			new WorkThread(i).start();   //创建并启动工作线程,线程池数量是多少就创建多少个工作线程
		}
	}
	
	/** 向工作队列中加入一个新任务,由工作线程去执行该任务*/
	public synchronized void execute(Runnable task) {
		if(isClosed) {
			throw new IllegalStateException();
		}
		if(task != null) {
			workQueue.add(task);//向队列中加入一个任务
			notify(); 			//唤醒一个正在getTask()方法中待任务的工作线程
		}
	}
	
	/** 从工作队列中取出一个任务,工作线程会调用此方法*/
	private synchronized Runnable getTask(int threadid) throws InterruptedException {
		while(workQueue.size() == 0) {
			if(isClosed) return null;
			System.out.println("工作线程"+threadid+"等待任务...");
			wait();				//如果工作队列中没有任务,就等待任务
		}
		System.out.println("工作线程"+threadid+"开始执行任务...");
		return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除
	}
	
	/** 关闭线程池 */
	public synchronized void closePool() {
		if(! isClosed) {
			waitFinish();        //等待工作线程执行完毕
			isClosed = true;
			workQueue.clear();  //清空工作队列
			interrupt(); 		//中断线程池中的所有的工作线程,此方法继承自ThreadGroup类
		}
	}
	
	/** 等待工作线程把所有任务执行完毕*/
	public void waitFinish() {
		synchronized (this) {
			isClosed = true;
			notifyAll();			//唤醒所有还在getTask()方法中等待任务的工作线程
		}
		Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。
		int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程
		for(int i =0; i < count; i++) { //等待所有工作线程结束
			try {
				threads[i].join();	//等待工作线程结束
			}catch(InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}

	/**
	 * 内部类,工作线程,负责从工作队列中取出任务,并执行
	 * @author sunnylocus
	 */
	private class WorkThread extends Thread {
		private int id;
		public WorkThread(int id) {
			//父类构造方法,将线程加入到当前ThreadPool线程组中
			super(ThreadPool.this,id+"");
			this.id =id;
		}
		public void run() {
			while(! isInterrupted()) {  //isInterrupted()方法继承自Thread类,判断线程是否被中断
				Runnable task = null;
				try {
					task = getTask(id);		//取出任务
				}catch(InterruptedException ex) {
					ex.printStackTrace();
				}
				//如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
				if(task == null) return;
				
				try {
					task.run();  //运行任务
				}catch(Throwable t) {
					t.printStackTrace();
				}
			}//  end while
		}//  end run
	}// end workThread
}

 

2.测试类

  

Java代码 复制代码  收藏代码
  1. package com.tdt.test;   
  2.   
  3. import com.tdt.impl.ls.ThreadPool;   
  4.   
  5. public class ThreadPoolTest {   
  6.        
  7.     public static void main(String[] args) throws InterruptedException {   
  8.         ThreadPool threadPool = new ThreadPool(3); //创建一个有个3工作线程的线程池  
  9.         Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行  
  10.         //运行任务   
  11.         for (int i = 0; i <=5 ; i++) { //创建6个任务  
  12.             threadPool.execute(createTask(i));   
  13.         }   
  14.         threadPool.waitFinish(); //等待所有任务执行完毕  
  15.         threadPool.closePool(); //关闭线程池   
  16.   
  17.     }   
  18.   
  19.     private static Runnable createTask(final int taskID) {   
  20.         return new Runnable() {   
  21.             public void run() {   
  22.             //  System.out.println("Task" + taskID + "开始");  
  23.                 System.out.println("Hello world");   
  24.             //  System.out.println("Task" + taskID + "结束");  
  25.             }   
  26.         };   
  27.     }   
  28. }  
package com.tdt.test;

import com.tdt.impl.ls.ThreadPool;

public class ThreadPoolTest {
	
	public static void main(String[] args) throws InterruptedException {
		ThreadPool threadPool = new ThreadPool(3); //创建一个有个3工作线程的线程池
		Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行
		//运行任务
		for (int i = 0; i <=5 ; i++) { //创建6个任务
			threadPool.execute(createTask(i));
		}
		threadPool.waitFinish(); //等待所有任务执行完毕
		threadPool.closePool(); //关闭线程池

	}

	private static Runnable createTask(final int taskID) {
		return new Runnable() {
			public void run() {
			//	System.out.println("Task" + taskID + "开始");
				System.out.println("Hello world");
			//	System.out.println("Task" + taskID + "结束");
			}
		};
	}
}

 

 

结果:

Java代码 复制代码  收藏代码
  1. 工作线程0等待任务...   
  2. 工作线程1等待任务...   
  3. 工作线程2等待任务...   
  4.   
  5. 工作线程0开始执行任务...   
  6. Hello world   
  7. 工作线程0等待任务...   
  8.   
  9. 工作线程1开始执行任务...   
  10. Hello world   
  11. 工作线程1等待任务...   
  12.   
  13. 工作线程2开始执行任务...   
  14. Hello world   
  15. 工作线程2等待任务...   
  16.   
  17. 工作线程0开始执行任务...   
  18. Hello world   
  19. 工作线程0等待任务...   
  20.   
  21. 工作线程1开始执行任务...   
  22. Hello world   
  23. 工作线程1等待任务...   
  24.   
  25. 工作线程2开始执行任务...   
  26. Hello world   
  27. 工作线程2等待任务...  
【EI复现】基于主从博弈的新型城镇配电系统产消者竞价策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于主从博弈理论的新型城镇配电系统中产消者竞价策略的研究,结合IEEE33节点系统,利用Matlab进行仿真代码实现。该研究聚焦于电力市场环境下产消者(既生产又消费电能的主体)之间的博弈行为建模,通过构建主从博弈模型优化竞价策略,提升配电系统运行效率与经济性。文中详细阐述了模型构建思路、优化算法设计及Matlab代码实现过程,旨在复现高水平期刊(EI收录)研究成果,适用于电力系统优化、能源互联网及需求响应等领域。; 适合人群:具备电力系统基础知识和一定Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程技术人员;尤其适合致力于电力市场博弈、分布式能源调度等方向的研究者。; 使用场景及目标:① 掌握主从博弈在电力系统产消者竞价中的建模方法;② 学习Matlab在电力系统优化仿真中的实际应用技巧;③ 复现EI级别论文成果,支撑学术研究或项目开发;④ 深入理解配电系统中分布式能源参与市场交易的决策机制。; 阅读建议:建议读者结合IEEE33节点标准系统数据,逐步调试Matlab代码,理解博弈模型的变量设置、目标函数构建与求解流程;同时可扩展研究不同市场机制或引入不确定性因素以增强模型实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值