java写的简单通用线程池demo
首先声明,代码部分来自网络。
1、入口DabianTest:
package com.lbh.myThreadPool; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.lbh.myThreadPool.ThreadPool; public class DabianTest { public static void main(String[] args) { //初始化池,并创建3条未执行任务的线程
ThreadPool threadPool = new ThreadPool(3);
threadPool.initPool(); //模拟DTO
List humanList = new ArrayList();
for(int i=0; i<10;i++){
Map human = new HashMap();
human.put("name", "jack"+i);
human.put("age", i+"");
humanList.add(human);
} //模拟BO,遍历任务,并添加到池中
DabianImpl bianBian;
for(int i = 0 ; i< humanList.size(); i++){
Map myHuman = (Map)humanList.get(i);
bianBian = new DabianImpl(myHuman.get("name").toString(),myHuman.get("age").toString());
threadPool.addJob(bianBian);//向池中添加新任务 try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2:线程池ThreadPool
package com.lbh.myThreadPool; import java.util.LinkedList; /**
* 线程池,包含调度及其他各种功能
*/
public class ThreadPool { protected int poolSize;//池默认容量
protected LinkedList<DabianThread> threadList = new LinkedList<DabianThread>();
protected boolean hasFreeThread = true;//池状态,true为有空闲线程。 public ThreadPool(int poolSize) {
this.poolSize = poolSize;
} /**
* 初始化池,创建等于池容量的线程数。
*/
public void initPool() {
for (int i = 0; i < poolSize; i++) {
DabianThread dabianThread = new DabianThread(this);
Thread thread = new Thread(dabianThread);
thread.start();
threadList.add(dabianThread);
}
System.out.println("初始化成功_"+"线程池容量:"+poolSize);
} /**
* 添加新任务到空闲线程中
*/
public void addJob(Dabian Dabian){
//先拿到空闲线程
DabianThread freeTh = getFreeThread();
if(freeTh != null && freeTh.hasJob == false){
freeTh.hasJob = true;
freeTh.dabian = Dabian;
freeTh.notifyJob();
}
else System.out.println("获取空线程失败,请检查。");
} /**
* 获取空闲线程
*/
public DabianThread getFreeThread(){
while(true){
for(int i=0; i < threadList.size(); i++){
DabianThread DabianTh = threadList.get(i);
if(!DabianTh.hasJob){
return DabianTh;
}
}
System.out.println("线程池已满,请等待。");
hasFreeThread = false;//将池状态设置为false //阻塞,直到有空闲线程
if(waitForFree()){
continue;
}
}
} /**
*更新空闲线程状态
*/
public void updateFreeState(){
this.hasFreeThread = true;
} /**
* 设置阻塞,直到有空闲线程
*/
public boolean waitForFree(){ while(!hasFreeThread){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
}
return true;
} }
3、线程处理DabianThread
package com.lbh.myThreadPool; /**
*@comment
*@author LolOT
*@date 2015-3-6 下午4:40:24
*@version 1.0.0
*@see
*/
public class DabianThread implements Runnable { ThreadPool pool;
Dabian dabian;
boolean hasJob; //初始化需要执行的线程对象
DabianThread(ThreadPool pool){
this.pool = pool;
this.hasJob = false;
} //唤醒休眠的线程,用于向池内添加任务时调用
public synchronized void notifyJob() {
hasJob = true;
this.notify();
} @Override
//运行线程,这里判断一下该线程中是否有任务,没有的话就wait。
public synchronized void run() {
try {
while (true) {
if (!hasJob) {
pool.hasFreeThread = true;
System.out.println("当前线程空闲,线程号:" + Thread.currentThread().getId());
this.wait();
} else {
dabian.process();
hasJob = false;
}
}
} catch (InterruptedException e) {
e.toString();
}
}
}
4、业务处理实现类DabianImpl
package com.lbh.myThreadPool; import java.text.SimpleDateFormat;
import java.util.Date; public class DabianImpl implements Dabian { String humanName;
String humanAge;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss SS");// 设置日期格式 public DabianImpl(String humanName, String humanAge){
this.humanName = humanName;
this.humanAge = humanAge;
} @Override
public void process() {
System.out.println("当前:"+humanName+"开始大便。" + sdf.format(new Date())+"线程号:"+Thread.currentThread().getId());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(humanName+"大便完成。" + sdf.format(new Date())+"线程号:"+Thread.currentThread().getId());
}
}
5、业务处理接口Dabian
/**
*
*/
package com.lbh.myThreadPool; public interface Dabian { public void process();
}
java写的简单通用线程池demo的更多相关文章
- java基础:简单实现线程池
前段时间自己研究了下线程池的实现原理,通过一些源码对比,发现其实核心的东西不难,于是抽丝剥茧,决定自己实现一个简单线程池,当自已实现了出一个线程池后.发现原来那么高大上的东西也可以这么简单. 先上原理 ...
- 简单C++线程池
简单C++线程池 Java 中有一个很方便的 ThreadPoolExecutor,可以用做线程池.想找一下 C++ 的类似设施,尤其是能方便理解底层原理可上手的.网上找到的 demo,基本都是介绍的 ...
- JAVA基础知识之多线程——线程池
线程池概念 操作系统或者JVM创建一个线程以及销毁一个线程都需要消耗CPU资源,如果创建或者销毁线程的消耗源远远小于执行一个线程的消耗,则可以忽略不计,但是基本相等或者大于执行线程的消耗,而且需要创建 ...
- 26、Java并发性和多线程-线程池
以下内容转自http://ifeve.com/thread-pools/: 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个 ...
- 【Java分享客栈】SpringBoot线程池参数搜一堆资料还是不会配,我花一天测试换你此生明白。
一.前言 首先说一句,如果比较忙顺路点进来的,可以先收藏,有时间或用到了再看也行: 我相信很多人会有一个困惑,这个困惑和我之前一样,就是线程池这个玩意儿,感觉很高大上,用起来很fashion, ...
- 转:Java Web应用中调优线程池的重要性
不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...
- Java Web应用调优线程池
最简单的单线程 我们先从基础开始.无论使用哪种应用服务器或者框架(如Tomcat.Jetty等),他们都有类似的基础实现.Web服务的基础是套接字(socket),套接字负责监听端口,等待TCP连接, ...
- Java Web应用中调优线程池的重要性
不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...
- Java 使用new Thread和线程池的区别
本文转至:https://www.cnblogs.com/cnmenglang/p/6273761.html , 孟凡柱的专栏 的博客,在此谢谢博主! 1.new Thread的弊端执行一个异步任务你 ...
随机推荐
- Jams倒酒(pour)
1.Jams倒酒(pour) Jams是一家酒吧的老板,他的酒吧提供2种体积的啤酒,a ml 和 b ml,分别使用容积为a ml 和 b ml的酒杯来装载. 酒吧的生意并不好.Jams发现酒鬼们都很 ...
- 苹果Xcode帮助文档阅读指南
文档导读 https://developer.apple.com/legacy/library/navigation/ 前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容.但是很多人 ...
- js css 构建滚动边框
注:预览效果请点击result选项卡,个人认为这种效果非常适合做友情链接. 完整代码 <!DOCTYPE html> <html xmlns="http://www.w3. ...
- shutdown命令
其实不需要使用软件,就可以实现自动关机或重启等功能的:Windows XP的关机是由Shutdown.exe程序来控制的,位于Windows\System32文件夹中.如 果想让Windows 200 ...
- Bson
https://en.wikipedia.org/wiki/BSON BSON /ˈbiːsɒn/ is a computer data interchange format used mainly ...
- Linux链接库二(动态库,静态库,库命名规则,建立个没有版本号的软连接文件)
http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http ...
- python基础字符串操作
去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sS ...
- jdk安装环境变量设置
设置JAVA_HOME,点击新建,变量名:JAVA_HOME,变量值:D:\java\jdk1.7.0,即刚才jdk安装的路径. 设置CLASSPATH属性,变量名:CLASSPATH,变量值:. ...
- SQL疑难杂症【1】解决SQL2008 RESTORE 失败问题
有时候从服务器或者其它电脑上面备份的数据库文件在还原到本地的时候会出现以下错误: 这种情况通常是备份文件之前的逻辑名称跟当前的名称对应不上,我们可以通过以下语句查看备份文件的逻辑名称: 知道备份文件 ...
- Redis 在新浪微博中的应用
Redis 在新浪微博中的应用 Redis简介 1. 支持5种数据结构 支持strings, hashes, lists, sets, sorted setsstring是很好的存储方式,用来做计数存 ...