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

一切为了资源与效率:Java线程池

 
阅读更多

一、前言

 

在软件开发过程中,总会遇到一些瓶颈。开发效率瓶颈,人员技术瓶颈,运行效率瓶颈,服务器瓶颈,磁盘IO瓶颈,CPU、内存瓶颈。这些都限制了我们的软件无法尽善尽美。我们的目的就是为了克服和改善这些难题,使软件比想象中更完美。

 

二、具体问题

 

在数据库或者是流程工作时,很多操作都是由于最初软件设计的原因,或者是当初一些产品设计的原因,或者因为时间紧迫,或者逼不得已必须如此做,然后被设计成同步操作,导致工作效率产生瓶颈,没有充分发挥CPU和内存的功能,但是软件工作起来慢的要死。这时候就需要重构代码了。

 

三、解决方案

 

在CPU和内存还有磁盘IO并没有充分利用的时候,就可以在重构的时候,使用线程操作,将过去需要占用一定时间的同步操作,进行并发处理。这样,创建多个线程来解决同一个问题。这样就可以使操作成为异步,不需要进行等待就可以同时操作很多事情。

那么线程需要创建多少呢?

每监听到一个请求就创建一个线程,然后操作之后就销毁。这种办法可行么?

 

如果突然在客户端提交了1000000 * N 个请求,这些请求都进入服务器,然后在这里,为每一个请求都创建一个线程来执行。这样程序就会失去控制。最终挤爆服务器CPU和内存,使程序崩溃。

 

怎么样合理、可控的处理操作,变成了重点。

 

四、线程池的概念

 

线程池,顾名思义,在池化开发的现在,如数据库连接池这种开发模式已经广泛流行。

在池中创建连接实例,在访问数据库时,从连接池中取得连接,操作之后归还。这样就可以有效的限制资源数量,但是又能提高操作速度。

 

五、编码示意

 

package test.dao;

import java.util.LinkedList;

import org.apache.log4j.Logger;


/**
 * 
 * @author Andy.xiaomeng
 *
 */
public class ThreadPool {

	private static final Logger Log = Logger.getLogger(ThreadPool.class);
	
	private ThreadWorker[] worker;
	private LinkedList<Runnable> queue;
	private int poolSize;
	
	public int getPoolSize(){
		return poolSize;
	}
	
	//initialize thread pool with pool size
	public ThreadPool(int size){
		
		poolSize = size;
		worker = new ThreadWorker[size];
		queue = new LinkedList<Runnable>();
		
		for (int i = 0; i < size; i++) {
			worker[i] = new ThreadWorker(); 
			worker[i].start();
		}
		
	}
	
	
	
	//add work queue
	public void addQueue(Runnable runnable){
		synchronized(queue) {
			queue.add(runnable);
			queue.notify();
		}
	}
	
	//worker do work
	private class ThreadWorker extends Thread{
		
		public void run(){
			
			//runnable
			Runnable runable;
			
			while (true) {
				
				synchronized(queue) {
                    while (queue.isEmpty()) {
                        try
                        {
                        	//is work queue is empty, wait
                            queue.wait();
                        }
                        catch (Exception e)
                        {
                        	Log.error("pool queue wait", e);
                        }
                    }
                    
                    //get work in queue, and remove it 
                    runable = queue.removeFirst();
                }

                try {
                	//do work
                	runable.run();
                }
                catch (RuntimeException e) {
                	Log.error("unknow runtime exception", e);
                }
				
			}
		}
		
	}
	
	public static void main(String[] args) {
		
		//test
		ThreadPool pool = new ThreadPool(111);
		
		
		//
		class SSS implements Runnable{
			private String abc;
			public void setAbc(String aaaaa){
				this.abc = aaaaa;
			}
			
			public void run() {
				System.out.println("do runnable " + abc);
			}
		}
		
		for (int i = 0; i < 200; i++) {
			SSS a = new SSS();
			a.setAbc(String.valueOf(i + 1));
			pool.addQueue(a);
		}
		
	}
}

 英文不好,中文语法的英文注释,直译吧。。。。。。

 

 附带了main方法的测试案例。

 

 首先创建线程池对象,设置创建线程数量。

 

 将需要做的事情,封装成一个Runnable ,然后添加到队列中。

 

 队列通知线程执行操作。

 

觉得有用帮顶下,帮到你了请回复。。谢谢= =

5
2
分享到:
评论
6 楼 leafyyq 2011-11-17  
[size=large][size=small][color=red]LZ 你好帅哦~~!  [/color][/[color=orange][/color]size][/size]
5 楼 huoyj 2011-10-26  
楼主的这个可以作为一个理解线程池原理的例子确实简洁明了,不过JDK里面已经提供了,为什么不直接去用,功能还更强大。
4 楼 smm11230704 2011-10-25  
tan4836128 写道
有成功应用并实现的案例么,
研究LZ的代码只是看到实现的一种思路,不知上述代码能否实现LZ所说“1000000 * N 个请求”?
强烈建议附上性能分析,希望能有后续跟进


理论上来讲,只要你CPU和内存允许,你线程数你可以随意开的。
不过,能省则省。毕竟其他地方也是要资源的。
利用不能过度也不能过于清闲。
合理才是根本
3 楼 smm11230704 2011-10-25  
tan4836128 写道
有成功应用并实现的案例么,
研究LZ的代码只是看到实现的一种思路,不知上述代码能否实现LZ所说“1000000 * N 个请求”?
强烈建议附上性能分析,希望能有后续跟进



有的,我优化版本的代码就是用了这个线程池实现的。

一般都是使用20个线程来做。
之前很多同步的数据库操作阻塞操作。导致很多消息发送延时(移动互联网项目)

。所以现在重构了一下。
2 楼 dengli 2011-10-25  
Mark!
1 楼 tan4836128 2011-10-25  
有成功应用并实现的案例么,
研究LZ的代码只是看到实现的一种思路,不知上述代码能否实现LZ所说“1000000 * N 个请求”?
强烈建议附上性能分析,希望能有后续跟进

相关推荐

    Java线程池使用说明

    Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低资源消耗。在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,...

    JAVA线程池例子

    Java线程池是一种高效管理线程资源的技术,它允许开发者创建一组可重用的工作线程,从而避免频繁地创建和销毁线程带来的性能开销。线程池在Java中主要通过`java.util.concurrent`包中的`ExecutorService`接口及其...

    java线程池实例

    Java线程池是一种高效管理线程资源的工具,它通过维护一组可重用的线程来减少创建和销毁线程的开销。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口和它的实现类,如`ThreadPoolExecutor`,来支持...

    Java线程池与ThreadPoolExecutor.pdf

    Java线程池是Java并发编程中的重要组成部分,它允许开发者管理多个线程并有效地调度任务。线程池通过ThreadPoolExecutor类实现,这是一个高度可配置的工具,能够根据具体需求定制线程的创建、管理和销毁策略。 ...

    java线程池的源码分析.zip

    Java线程池是Java并发编程中的重要组成...通过深入研究Java线程池的源码,我们可以更好地控制并发任务的执行,优化系统性能,同时避免潜在的资源浪费和线程安全问题。理解并熟练运用线程池是每个Java开发者必备的技能。

    50879510A6_Java线程池_funbde_

    学习和理解Java线程池,不仅能够提升多线程编程的效率,还能帮助我们更好地控制系统的并发行为,防止过多的线程导致系统资源耗尽。因此,深入研究线程池的工作原理和使用方式,对于任何Java开发者来说都是十分必要的...

    java线程池threadpool简单使用源码

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...

    Java线程池文档

    总之,Java线程池是Java多线程编程中不可或缺的一部分,通过合理的线程池配置,可以显著提升程序的并发性能和资源利用率。在理解和使用线程池时,不仅要关注其实现原理,还需要根据实际需求调整线程池的配置,以达到...

    java 四种线程池实例

    Java线程池是一种高效管理线程的技术,它可以帮助开发者更好地控制并发执行的线程数量,避免资源浪费,提高系统性能。在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的...

    java 线程池

    ### Java线程池详解 #### 一、线程与线程池的概念 在Java中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(例如某个Java应用)至少有一个线程,如果线程...

    Java版线程池实现

    Java线程池是一种高效管理并发任务执行的机制,它通过预先创建并维护一定数量的线程,从而避免了频繁地创建和销毁线程所带来的性能开销。在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`...

    JAVA使用线程池查询大批量数据

    在Java开发中,处理大批量数据时,合理利用线程池可以显著提高程序的执行效率和资源利用率。本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。...

    Java实现通用线程池

    1. 创建线程池:使用ThreadPoolExecutor类创建线程池,设置线程池的核心线程数、最大线程数和keepAliveTime等参数。 2. 提交任务:将任务提交给线程池,线程池会自动选择空闲线程执行任务。 3. 监控线程池:使用...

    JAVA线程池原理以及几种线程池类型介绍.doc

    Java线程池是一种高效管理线程的工具,它允许开发者预先创建一组线程,并复用它们来处理任务,从而降低了创建和销毁线程的开销。线程池的使用尤其适用于处理大量短小任务的场景,例如Web服务器、数据库服务器等。在...

    简单线程池与线程池检查的实现

    5. 销毁线程池:当线程池不再需要时,可以安全地关闭线程池,释放资源。 线程池检查是确保线程池高效、稳定运行的重要手段,主要检查以下几个方面: 1. 线程池状态:检查线程池是否正常运行,是否存在过多的阻塞...

    JAVA线程池原理以及几种线程池类型介绍

    ### JAVA线程池原理及几种线程池类型的详细介绍 #### 一、线程池的引入背景及重要性 在现代软件开发中,特别是在基于Java的应用程序设计中,线程池技术已经成为提高系统性能和资源利用率的关键手段之一。线程池...

    Java线程池技术详解

    【Java线程池技术详解】 线程池是Java并发编程中的一个重要概念,它是一种线程使用模式,旨在优化线程的管理和使用,提高系统资源的利用率。线程池的引入是为了应对频繁创建和销毁线程所带来的性能开销,因为创建和...

    基于Java线程池技术的数据爬虫设计与实现.pdf

    为了提高数据爬取的效率,减少资源浪费,线程池技术与多线程技术在数据爬虫中的应用显得尤为重要。本文所提及的基于Java线程池技术的数据爬虫设计与实现,不仅涉及到了数据爬虫的原理和架构,还包括了多线程编程的...

    Java实现的线程池、消息队列功能

    标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...

    Java并发编程:线程池的使用 - 平凡希 - 博客园1

    Java并发编程中的线程池是提高系统效率的关键工具,它解决了频繁创建和销毁线程的问题。线程池通过复用已存在的线程来处理任务,从而避免了每次任务执行完毕后销毁线程的开销。在Java中,线程池的核心实现是`java....

Global site tag (gtag.js) - Google Analytics