`
grayliu
  • 浏览: 11726 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

建立自己的JAVA线程池

阅读更多

为什么要建立线程池?

 

在多线程项目中,如果建立的线程过多,反而可能导致运行速度大大减慢,这是由于线程建立所花费的时间和资源都比较多。
所以我们在多线程中必须很好地来管理线程, 在很好利用多线程能“同步工作”的好处之外,更有效地提高程序运行速度。

 

线程池是什么?

 

线程池是指具有固定数量的线程组成的一种组件。这些线程用来循环执行多个应用逻辑。

 

怎么建立线程池?

 

线程池主要包括4个部分,它们是:
1. 线程管理
 

主要是用来建立,启动,销毁工作线程和把工作任务加入工作线程。

 

2. 工作线程
 

它是真正的线程类,运行工作任务。

 

3. 工作队列
 

它是用来封装线程的容器。


4. 工作任务
 

它是实现应用逻辑的具体类。

 

流程图:

flow chart.

 

 线程管理类:

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * ThreadPoolManager.java
 *
 */

/**
 * the thread pool manager, is responsible for starting and stopping the work thread.
 * 
 * @author  gray
 * @version 1.0
 */
public class ThreadPoolManager {

	private static final int DEFAULT_POOL_SIZE = 4;
	private List<WorkThread> threadPool;
	private Queue<Task> taskQueue;
	private int poolSize;
	
	public ThreadPoolManager() {
		this(DEFAULT_POOL_SIZE);
	}
	
	public ThreadPoolManager(int poolSize) {
		if(poolSize <= 0) {
			this.poolSize = DEFAULT_POOL_SIZE;
		}else {
			this.poolSize = poolSize;
		}
		threadPool = new ArrayList<WorkThread>(this.poolSize);
		taskQueue = new ConcurrentLinkedQueue<Task>();
		startup();
	}
	
	public void startup() {
		System.out.println("start work thread...");
		synchronized(taskQueue) {
			for(int i = 0; i < this.poolSize; i++) {
				WorkThread workThread = new WorkThread(taskQueue);
				threadPool.add(workThread);
				workThread.start();
			}
		}
	}
	
	public void shutdown() {
		System.out.println("shutdown work thread...");
		synchronized(taskQueue) {
			for(int i = 0; i < this.poolSize; i++) {
				threadPool.get(i).shutdown();
			}			
			
			System.out.println("done...");
		}
	}
	
	public void addTask(Task task) {
		synchronized(taskQueue) {
			taskQueue.add(task);
			taskQueue.notify();
		}
	}
}

 

工作线程类:

import java.util.Queue;

/**
 * WorkThread.java
 *
 */

/**
 * the work thread used pull the task of task queue, and execute it.
 * 
 * @author  gray
 * @version 1.0
 */
public class WorkThread extends Thread {

	private boolean shutdown = false;
	private Queue<Task> queue;
	
	public WorkThread(Queue<Task> queue) {
		this.queue = queue;
	}
	
	public void run() {
		while(!shutdown) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			System.out.println(Thread.currentThread() + " is running...");
			synchronized(queue) {
				if(!queue.isEmpty()) {
					Task task = queue.poll();
					task.execute();
				}else {
					try {
						queue.wait(1000);
						System.out.println(Thread.currentThread() + " wait...");
					}catch(InterruptedException e) {
						
					}
				}
			}
		}
	}
	
	public void shutdown() {
		shutdown = true;
	}
}

 

工作任务接口:

 

/**
 * Task.java
 *
 */

/**
 * The task want to execute.
 * 
 * @author  gray
 * @version 1.0
 */
public interface Task {

	public void execute();
}

 

工作任务类:

/**
 * SimpleTask.java
 *
 */

/**
 * @author  gray
 * @version 1.0
 */
public class SimpleTask implements Task {

	/* (non-Javadoc)
	 * @see Task#execute()
	 */
	public void execute() {
		System.out.println(Thread.currentThread());
	}

}

 

线程池测试类:

/**
 * ThreadPoolDemo.java
 *
 */

/**
 * @author  gray
 * @version 1.0
 */
public class ThreadPoolDemo {

	public static void main(String[] args) {
		ThreadPoolManager threadMg = new ThreadPoolManager();
		
		for(int i = 0; i < 50; i++) {
			threadMg.addTask(new SimpleTask());
		}
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		threadMg.shutdown();
	}	
}

 

 

~The End~

分享到:
评论
9 楼 FeiXing2008 2009-11-11  
那样你的也一样是要创建线程的
8 楼 grayliu 2009-06-22  
pekkle 写道
做web开发,没用到线程,不知道楼主做什么项目,用到线程


web也有多线程的啊,你多个人同时访问不就是多线程啦啊。servlet调用就是多线程的。
7 楼 pekkle 2009-06-19  
做web开发,没用到线程,不知道楼主做什么项目,用到线程
6 楼 rubylover 2009-05-30  
代码
 synchronized(queue) {   
                if(!queue.isEmpty()) {   
                    Task task = queue.poll();   
                    task.execute();   
                }else {   
                    try {   
                        queue.wait(1000);   
                        System.out.println(Thread.currentThread() + " wait...");   
                    }catch(InterruptedException e) {   
                           
                    }   
                }   
            }   



主要工具都在task.execute();里处理,楼主贴出的代码task.execute()执行相当于串行处理,并发并没实际意义。 ,一点自己的看法而已。
5 楼 smalltiger1984 2009-05-18  
1.5 的concurrent包里是有线程池类,刚简单的看了一下,他的task就是一个thread,这样还不是同样要占用建thread的系统资源吗?
4 楼 grayliu 2009-05-18  
还是使用类库的吧
FeiXing2008 写道

在Java标准里就已经有线程池的类了。觉得还是使用类库的吧,,


1.5 的concurrent包里是有线程池类,刚简单的看了一下,他的task就是一个thread,这样还不是同样要占用建thread的系统资源吗?
3 楼 grayliu 2009-05-18  
凤舞凰扬 写道

&nbsp;&nbsp; 楼上的想法不错,不过贴出的程序还是存在蛮多问题的,只能是一个简单介绍的sample,离应用还是有些距离的。


哪里存在问题呢,望指点。。。
2 楼 FeiXing2008 2009-05-16  
在Java标准里就已经有线程池的类了。觉得还是使用类库的吧,,
1 楼 凤舞凰扬 2009-05-15  
   楼上的想法不错,不过贴出的程序还是存在蛮多问题的,只能是一个简单介绍的sample,离应用还是有些距离的。

相关推荐

    Java线程池及观察者模式解决多线程意外死亡重启问题

    Java线程池是Java并发编程中的重要组成部分,它允许开发者高效地管理多个并发执行的线程,有效地控制系统的资源消耗,提高系统性能和稳定性。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口及其...

    深入java线程池的使用详解

    5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ...

    JAVA 写的SOCKET线程池

    Java的Socket API提供了一套丰富的类和接口,使得开发者可以方便地建立和管理TCP连接。然而,在高并发场景下,单纯地为每个客户端请求创建新的线程可能会导致资源浪费和系统性能瓶颈,因此引入线程池的概念。 ...

    基于JAVA的websocket实现(含java后端)

    WebSocket是一种在客户端和服务器之间建立长连接的网络通信协议,它允许双向实时通信,极大地提升了交互性。在本文中,我们将深入探讨如何基于Java来实现WebSocket服务,包括后端的处理逻辑。 首先,理解WebSocket...

    java多线程实现大批量数据导入源码

    `ExecutorService`是Java并发框架的一部分,它允许我们管理和控制线程池。`ThreadPoolExecutor`是`ExecutorService`的一个具体实现,我们可以自定义线程池的大小(核心线程数和最大线程数)、线程存活时间、工作队列...

    JAVA服务器端应用Socket线程池

    ### JAVA服务器端应用Socket线程池详解 #### 一、引言 在现代软件开发中,特别是对于服务器端的应用程序而言,高效的并发处理能力是非常重要的。为了提高系统的响应能力和资源利用率,很多Java开发者会选择使用...

    java+socket 及多线程线程池应用(IBM教程)

    Java Socket编程是网络编程的基础,它提供了在网络中两个应用程序间建立和通信的接口。而多线程和线程池在Java编程中则是提高系统效率、优化资源管理的关键技术。IBM作为全球知名的科技公司,其提供的教程往往具有...

    Java下载器的简单实现及实时进度和速度获取

    3. 发送请求:调用`connect()`方法建立实际的网络连接。 4. 获取响应:通过`getInputStream()`方法获取服务器返回的数据流,这通常是一个`InputStream`对象。 三、实时进度和速度的获取 1. 计算下载进度:为了实时...

    面向Socket基于线程池技术的java聊天室程序下载(含源代码)

    本程序采用面向Socket编程和线程池技术,这两种技术在Java网络编程中扮演着核心角色。 首先,Socket编程是TCP/IP协议族的一部分,它提供了进程间的网络通信能力。在Java中,`java.net.Socket`类和`java.net....

    java手写连接池

    当一个应用需要与数据库通信时,它会从池中获取一个已存在的连接,而不是每次都去建立新的连接。使用完毕后,连接会返回到池中,供其他请求使用。这种方式可以显著减少创建和销毁连接的时间,提升系统的响应速度和...

    java TCP通信服务器端实现代码

    在Java编程语言中,TCP(传输控制协议)通信是一种常用的方式,用于建立可靠的、面向连接的数据传输。在本文中,我们将深入探讨如何实现一个Java TCP通信服务器端,并使用线程池来处理并发请求。 首先,TCP是网络七...

    线程池+socket

    - 当Socket连接建立后,将任务提交到线程池执行,主线程继续监听新的客户端连接,实现高并发的Socket服务器。 总之,线程池和Socket的结合使用,能够高效地处理网络服务中的并发连接,提高服务器的吞吐量和响应...

    Java四种常用线程池的详细介绍

    2. 可缓存线程池(Executors.newCachedThreadPool()):可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型...

    android 线程池下载

    在Android中,我们可以使用`java.util.concurrent`包下的`ExecutorService`和`ThreadPoolExecutor`来创建线程池。`ExecutorService`是线程池的接口,而`ThreadPoolExecutor`是它的具体实现,提供了更灵活的配置选项...

    使用IO完成端口机制实现的定制线程池的代码

    在Java等编程语言中,线程池是通过执行器(Executor)框架实现的,尤其是`java.util.concurrent`包中的`ThreadPoolExecutor`类。线程池通过减少创建和销毁线程的开销,优化系统资源的分配,可以显著提高系统的并发...

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc

    当一个新连接建立时,`executorService.execute(new CallService(socket))`将`Socket`对象传递给`CallService`实例,然后将其放入线程池中运行。`CallService`实现了`Runnable`接口,意味着它可以作为任务在单独的...

    java+WebSocket实现

    对于性能优化,可以考虑使用线程池来处理并发连接,以及缓存策略来减少服务器负载。 这个"Mavenproject1"的压缩包文件很可能是包含了一个完整的Java WebSocket应用示例,包括了服务器端的Java代码、客户端的HTML和...

    对象池&线程池&数据库连接池

    Java的`ExecutorService`和`ThreadPoolExecutor`类是线程池的主要实现。线程池可以控制并发级别,防止过多线程导致系统资源耗尽,并且提供了一些高级特性,如定时任务、延迟任务等。 3. **数据库连接池**: 数据库...

    xianchengchi.zip_Socket 线程池_socket池_线程池_线程池socket

    2. 线程池中的线程负责与客户端建立Socket连接,接收和发送数据。 3. 如果所有线程都在忙,新来的请求会被放入队列等待,直到有线程可用。 4. 当线程完成任务后,不会立即销毁,而是返回线程池,等待下一次分配任务...

    JAVA面试大全

    总而言之,Java的无关性、数据库连接池和线程池的概念是Java面试中的重要考点,它们涵盖了Java编程的基础知识以及性能优化的实践技能,对于希望在Java开发领域深造的求职者来说,深入理解这些概念和它们的应用是非常...

Global site tag (gtag.js) - Google Analytics