`
cjj_720
  • 浏览: 32957 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自创java线程池

    博客分类:
  • java
阅读更多
/**
 * 2010-8-3 下午09:14:29
 * @auth cjj
 */
package org.prime.threadpool;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author cjj
 * 
 */
public class CPrimePool {

	private Object lock = new Object();

	private volatile boolean stop = false;

	private int coreSize;

	private int maxSize;

	private AtomicInteger curThreadCount = new AtomicInteger();

	private Queue<WorkThread> cacheThreads = new ConcurrentLinkedQueue<WorkThread>();

	public CPrimePool() {
		init();
	}

	public CPrimePool(int coreSize, int maxSize) {
		this.coreSize = coreSize;
		this.maxSize = maxSize;
		init();
	}

	private void init() {
		if (coreSize == 0) {
			coreSize = 1;
		}
		if (maxSize == 0) {
			maxSize = Runtime.getRuntime().availableProcessors() + 1;
		}
	}

	public void runTask(Runnable task) {
		if (!stop) {
			if (curThreadCount.get() < coreSize) {
				WorkThread work = new WorkThread();
				int i = curThreadCount.getAndIncrement();
				work.setName("Work Thread : "+i);
				work.start();
				work.setTask(task);
			} else {
				WorkThread work = cacheThreads.poll();
				if (work != null) {
					work.setTask(task);
				} else {
					if (curThreadCount.get() < maxSize) {
						work = new WorkThread();
						int i = curThreadCount.getAndIncrement();
						work.setName("Work Thread : "+i);
						work.start();
						work.setTask(task);
					} else {
						synchronized (lock) {
							while ((work = cacheThreads.poll()) == null
									&& !stop) {
								try {
									lock.wait();
								} catch (InterruptedException e) {
									// ignore
								}
							}
						}
						if (!stop) {
							work.setTask(task);
						}
					}
				}
			}
		}
	}

	public void stop() {
		stop = true;
		WorkThread work = null;
		while ((work = cacheThreads.poll()) != null) {
			work.interrupt();
		}
	}

	private class WorkThread extends Thread {

		private Runnable task;

		public void setTask(Runnable task) {
			synchronized (this) {
				this.task = task;
				notifyAll();
			}

		}

		@Override
		public void run() {
			while (!stop) {
				try {
					if (task != null) {
						task.run();
					}
					synchronized (lock) {
						task = null;
						// 回收
						cacheThreads.add(this);

						lock.notifyAll();
					}
					synchronized (this) {
						while (task == null && !stop) {
							wait();
						}
					}
				} catch (InterruptedException ie) {
					break;
				}
			}
		}

	}

}


使用示例代码:
/**
 * 2010-8-3 下午11:31:28
 * @auth cjj
 */
package org.prime.threadpool.test;

import org.prime.threadpool.CPrimePool;

/**
 * @author cjj
 * 
 */
public class Test {

	/**
	 * @param args
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException {
		CPrimePool pool = new CPrimePool();
		for (int i = 0; i < 500000; i++) {
			pool.runTask(new MyThread(i));
		}
		// Thread.sleep(30000);
		pool.stop();
	}

	static class MyThread implements Runnable {

		private int i;

		public MyThread(int i) {
			this.i = i;
		}

		@Override
		public void run() {
			for (int i = 0; i < Integer.MAX_VALUE; i++) {
				System.out.println("thread:" + i);
			}
		}

	}

}
分享到:
评论

相关推荐

    java中MVC与LookAndFeel类及自创界面(更新)

    总的来说,理解并熟练掌握Java中的MVC模式、LookAndFeel以及自创界面,对于成为一名专业的Java GUI开发者至关重要。这不仅可以帮助你构建高效且易维护的应用,还能提升用户体验,使你的软件更具吸引力。通过实践和...

    java面试自创避邪宝典

    Java面试中的核心知识点涵盖了许多方面,这里我们主要讨论《java面试自创避邪宝典》中提到的一些关键点,包括JNDI、Struts1与Struts2的区别以及它们在设计模式、依赖、测试性、输入捕获、表达式语言和视图绑定等方面...

    北化java作业附自编jar运行软件

    【标题】"北化java作业附自编jar运行软件"涉及到的是Java编程语言的学习与实践,特别是关于Java项目打包和运行的知识。Java是面向对象的编程语言,广泛应用于服务器端开发、移动应用、桌面应用等领域。北京化工大学...

    java中MVC与LookAndFeel类及自创界面ExtraLAF

    在Java编程领域,MVC(Model-View-Controller)模式是一种广泛应用的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离使得代码更加模块化,易于维护和扩展。...

    植物大战僵尸金色版(自创改版)

    自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版自创改版...

    Java自己开发的一个工作流引擎例子

    然后我将Javasc代码用Java改写了,并且用mysql建了数据库表,进行了测试,可以处理一些简单的流程。我觉得代码很有学习参考价值,所以上传到这里,希望对大家有些帮助,里面附上html文件是Javascript写的工作流引擎...

    Java笔记桌面程序

    本项目名为"Java笔记桌面程序",它是由一个热衷于编程的开发者为解决其所在公司无法使用网络笔记客户端的问题而自创的。这个程序采用Java语言编写,充分体现了Java的跨平台特性,可以在多种操作系统上运行,包括...

    java_chat.rar_java 聊天室_java聊天室_java聊天室程序_java鑱婂ぉ_java鑱婂ぉ瀹

    "java鑱婂ぉ"和"java鑱婂ぉ瀹"可能是对Java聊天室的特定功能或者特性的描述,但这两个词汇在标准的Java术语中并不常见,可能是指开发者或发布者自创的术语,或者翻译上的差异。 Java作为一种跨平台的编程语言,因其...

    java扫雷游戏,功能比较完善

    开发者可能使用了开源或自创的资源,所以提供了这些信息以遵循版权法规。 3. **java扫雷游戏**:这是一个可能包含游戏主程序的文件,可能是.class文件(Java编译后的字节码)或.jar文件(Java应用程序归档,可以...

    JAVA图像去噪程序

    本项目是一个基于JAVA实现的图像去噪程序,包括了三种不同的去噪算法:均值法、中值法以及自创改进的均值法。下面将详细解释这些方法及其在实际应用中的原理。 1. **均值滤波**: 均值滤波是最基础的滤波方法之一,...

    java GUI 山寨QQ

    "我的孤独草"可能是一个开发者自创的标签,可能是项目的情感表达或者某种特色。 在【压缩包子文件的文件名称列表】中: - QQ_log.ldf 和 QQ.mdf 是SQL Server数据库文件的组成部分。.ldf文件存储事务日志信息,用于...

    单本JAVA电子书制作工具

    标题中的“单本JAVA电子书制作工具”是指一个专门用于创建和编辑JAVA格式电子书的软件或程序。这种工具通常简化了将文本、图像和其他多媒体内容整合到一...对于希望自创电子书或分享知识的人来说,这样的工具极具价值。

    c语言自创推箱子游戏改版.zip

    c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子游戏改版c语言自创推箱子...

    java 连接数据库 lookandfeel java网络编程

    在Java编程中,"Look and Feel"是一个关键概念,它涉及到用户界面(UI)的视觉样式和交互体验。Java提供了一种机制,允许开发者改变应用程序的外观和感觉,以匹配不同的操作系统或用户的个人喜好。在提供的描述中,...

    c语言自创军旗游戏源码.rar

    c语言自创军旗游戏源码.rarc语言自创军旗游戏源码.rarc语言自创军旗游戏源码.rarc语言自创军旗游戏源码.rar

    自创打包工具指引

    自创打包工具指引 在IT行业中,打包工具是软件开发过程中的重要环节,它能够将源代码、资源文件以及配置信息整合成一个可部署的格式,便于分发、测试和安装。本文将介绍一个名为“jwxtsns”的自创打包工具,用于...

    达内hibernate自创API

    在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足特定项目需求或提高开发效率,开发者有时会创建自定义的Hibernate API。达内教育作为国内知名的IT培训...

    网上书店~自创!!

    - 后端:可能基于PHP、Python、Java等后端语言搭建,使用MVC(Model-View-Controller)设计模式,确保代码结构清晰,易于维护。 - 数据库:MySQL或PostgreSQL等数据库管理系统用于存储书籍信息、用户数据和订单...

    Java五子棋源码课程设计

    【Java五子棋源码课程设计】是一门深入学习Java编程和游戏...此外,自创的界面设计也锻炼了学生的创新思维和美术设计能力。在完成这个项目后,学生将具备开发更多复杂应用的能力,为未来的学习和职业生涯奠定坚实基础。

Global site tag (gtag.js) - Google Analytics