`
geeksun
  • 浏览: 965283 次
  • 性别: 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后,就会把到达的任务放到缓存队列当中; ...

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

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

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

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

    线程池原理及创建(C++实现)

    ### 线程池原理及创建(C++实现) #### 一、线程池的重要性 在现代计算环境中,网络服务器面临着处理大量并发请求的挑战,其中包括但不限于Web服务器、电子邮件服务器和数据库服务器。这类服务器通常需要在短时间...

    java线程池使用后到底要关闭吗

    java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?...

    Django异步任务线程池实现原理

    文章通过实例展示了如何创建一个全局线程池类,该类中封装了线程池对象,并提供了向线程池提交任务、检查任务是否在运行等方法。全局线程池的生命周期与Django主线程的生命周期一致,确保了线程资源的合理释放。 5....

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

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一组线程并维护一个线程集合来处理并发任务。在Windows操作系统中,内建的线程池API(Thread Pool API)提供了高效且灵活的线程管理机制,...

    一个简单线程池的实现

    线程池是一种在多线程编程中非常重要的概念,它能有效地管理和调度系统中的线程资源,从而提高系统的效率和响应速度。在这个简单的线程池实现中,我们可以通过`pthread_pool.cpp`、`MainFunctionForTest.cpp`、`...

    VC++ 线程池(ThreadPool)实现

    在编程领域,线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池在C++中是提高程序效率和资源管理的重要工具,尤其在处理大量并发操作时。本文将深入探讨VC++中...

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    linux线程池创建c实现

    Linux 线程池创建 C 实现 线程池是一种常用的并发编程技术,它可以提高应用程序的性能和响应速度。在 Linux 系统中,使用 C 语言创建线程池可以实现高效的并发处理。 什么时候需要创建线程池呢?简单的说,如果一...

    DELPHI的ThreadPool的线程池DEMO

    DELPHI的线程池(ThreadPool)是一种高效管理并发任务的技术,它允许程序在需要时创建线程,而不是每次需要执行任务时都手动创建。线程池通过预先创建一组线程,然后根据需要分配任务,减少了线程创建和销毁的开销,...

    多线程写法(精易模块线程池和鱼刺模块线程池)

    本篇文章将重点探讨两种线程池实现:精易模块线程池和鱼刺模块线程池,并通过源码分析来展示它们的特点和用法。 首先,精易模块(SanYe Module)是由中国程序员SanYe开发的一系列开源模块,其中包含了线程池的实现...

    Linux线程池目录拷贝

    在Linux系统中,线程池是一种高效的进程管理方式,它允许多个任务并行执行,同时限制了系统中并发线程的数量,以优化资源分配和调度。本项目实现了利用线程池进行目录拷贝的功能,这涉及到多个重要的编程概念和技术...

    线程池管理多线程上传

    线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...

    仿ACE线程池机制实现的线程池类

    线程池是一种优化资源管理的机制,通过预先创建并维护一组可重用的线程,避免频繁地创建和销毁线程带来的性能开销。在Java、C++等编程语言中,线程池广泛应用于并发处理,提高系统效率,降低系统的资源消耗。本项目...

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

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

    c++ 多线程线程池 demo

    线程池是多线程编程中一个重要的概念,它能够优化系统资源的使用,提高系统的响应速度和效率。本篇文章将深入探讨C++中的线程池实现,并通过名为“OEasyPool-1.0”的示例来展示其工作原理。 线程池是预先创建并维护...

    C#线程池 所有线程运行完毕

    在C#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...

Global site tag (gtag.js) - Google Analytics