`
geeksun
  • 浏览: 955410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程池

 
阅读更多

WHAT

线程池是一种池化技术,初始化时创建一定数量的线程放入池中,当外界请求调用线程时,直接从池中取出可用线程进行业务处理,用完放回池中。

 

WHY

线程池因为在初始时创建了一定数量的线程,这样减少了创建线程的资源开销,对于高并发需求来说,对于提高性能、减少系统CPU的计算开销,大有好处。

特别是针对应用请求来得急,要求处理快场景,如果每一个请求创建一个新线程则导致性能问题。

 

HOW

线程池有各种语言实现,此处是JAVA语言版本:

 

/**
 * 线程池
 */
public class ThreadPool {
	int maxCounts;												// 线程池最大数量
	Vector<Runnable> container;									// 线程容器
	
	public ThreadPool(int maxCounts){
		this.maxCounts = maxCounts;
		container = new Vector(maxCounts);
		for(int i=0;i<container.capacity();i++){
			WorkThread wt = new WorkThread();
			container.add(wt);
			wt.start();
		}
	}
	
	/**
	 * 处理请求
	 */
	public void processReq(String args){
		int i;
		/**  轮询空闲线程,找出来干活  */
		for(i=0;i<container.capacity();i++){
			WorkThread wt = (WorkThread) container.get(i);
			if(!wt.isBusy()){
				System.out.println(wt.getId() + "线程正闲着,开始接客" + args);
				wt.setBusy(true);
				wt.setArgs(args);
				System.out.println(wt.getId() + "线程接完客" + args + ",开始休息");
				break;
			}
		}
		if(i == container.capacity()){
			System.out.println("各线程都在忙着,请稍等");
		}
	}
}

/**
 * 工作线程
 */
class WorkThread extends Thread{
	
	/** 是否忙碌 */
	private boolean isBusy;
	
	/** 接收到的参数  */
	private String args;

	public String getArgs() {
		return args;
	}

	public void setArgs(String args) {
		this.args = args;
	}

	public boolean isBusy() {
		return isBusy;
	}

	/**
	 * 设置是否忙碌状态
	 * @param isBusy
	 */
	public synchronized void setBusy(boolean isBusy) {
		this.isBusy = isBusy;
		/**  线程忙碌时,唤醒  */
		if(isBusy){
			notify();
		}
	}

	/**
	 * run片断也要同步,不然报current thread not owner异常
	 */
	public synchronized void run(){
		while(true){
			if(isBusy()){
				System.out.println(this.getId() + "工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟");
				try {
					sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				setBusy(false);
			} else {
				try {
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 测试类:

 

import java.util.Scanner;

public class PoolTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str;
		Scanner scan = new Scanner(System.in);
		// CPU数量+1
		ThreadPool pool = new ThreadPool(3);
		while(true){
			str = scan.nextLine();
			pool.processReq(str);
		}
	}
}

 输出结果:

 

test
8线程正闲着,开始接客test
8线程接完客test,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
111
8线程正闲着,开始接客111
8线程接完客111,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
testi
9线程正闲着,开始接客testi
9工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
9线程接完客testi,开始休息
ooooo
8线程正闲着,开始接客ooooo
8线程接完客ooooo,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
ieie
10线程正闲着,开始接客ieie
10线程接完客ieie,开始休息
10工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
oad
9线程正闲着,开始接客oad
9线程接完客oad,开始休息
9工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟
iad
各线程都在忙着,请稍等
iiii
8线程正闲着,开始接客iiii
8线程接完客iiii,开始休息
8工作线程接受请求并开始处理..,处理一个任务请求大约需要5秒钟

参考文献:

1. http://www.ibm.com/developerworks/cn/java/j-jtp0730/

2. http://blog.csdn.net/zikwang/article/details/2245496

  • 大小: 9.9 KB
  • 大小: 10.5 KB
分享到:
评论

相关推荐

    线程池线程池线程池线程池

    线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池...

    java线程池概念.txt

    corePoolSize:核心池的大小,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; ...

    阻塞线程池 阻塞线程池 阻塞线程池

    阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池...

    Python 使用threading+Queue实现线程池示例

    一、线程池 1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3&gt;T2,那...

    线程池  

    VC实现线程池

    易语言真正的线程池简易实现

    易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    Windows下一个比较完美的线程池实现和示例

    Windows下一个比较完美的线程池实现和示例 本线程池提供了如下功能: 1.能根据任务个数和当前线程的多少在最小/最大线程个数之间自动调整(Vista后的系统有 SetThreadpoolThreadMaximum 等函数有类似功能); 2.能方便...

    C#管理线程池的类ThreadManager

    C#管理线程池的类 /* How to use Thread Classs * * ============== * public ELMService() { InitializeComponent(); etm.ClalThreadPool("EmailThreads", (uint)ApplicationInfo.EmailParsingThreads); ...

    线程池.zip,互斥锁+条件变量+队列,实现线程池,包括线程池的创建,塞任务,和销毁线程池

    线程池

    SpringBoot线程池详解含完整示例(值得珍藏)

    Spring Boot中内置了多种线程池,为应用程序提供快速响应和高吞吐量的运行环境。线程池在Spring Boot中起着至关重要的作用,它能够有效地管理和复用线程,降低系统的开销。本文将详细介绍线程池的基本参数、每一种...

    易语言线程池操作例程(解决内存不断升高的问题)

     因为本人是个小白,多线程经常用,但是线程池并没有用过,(一听到线程池,总感觉高大上)。但是近期写彩票软件的时候发现,多线程长期操作会导致内容不断的升高直至报错,遂想起了线程池,完善后发现不是一般的叼...

    一个通用的Java线程池类

    2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...

    C++实现线程池详解(基于boost源码以及封装等线程池)

    一、要实现高效的线程池,可以考虑以下几点 二、实现线程池可以按照以下步骤进行 三、简单的C++线程池代码示例 四、 基于boost编写的源码库 - 线程池 4.1 基于boost编写的源码库地址 4.2 boost线程池的先进先出、...

    VC简单的线程池使用实例

    1.线程池管理器(ThreadPoolManager):用于创建并管理线程池 2.工作线程(WorkThread): 线程池中线程 3.任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。 4.任务队列:用于存放没有处理的...

    如何使用线程池

    以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...

    linux线程池创建c实现

    linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现 linux线程池创建c实现

    windows线程池,使用Windows自带的线程池api功能,比你写的线程池性能好得多

    使用Windows自带的线程池功能,比你写的线程池性能好得多

    Linux下通用线程池的构建

    什么是线程池?简单点说,线程池就是有一堆已经创建好了的线程,初始它们都处于空闲等待状态,当有新的任务需要处理的时候,就从这个池子里面取一个空闲等待的线程来处理该任务,当处理完成了就再次把该线程放回池中...

    一个简单线程池的实现

    这是一个简单线程池的实现,虽然有很多bug,但是能够简单地实现线程池。

Global site tag (gtag.js) - Google Analytics