首先声明,代码部分来自网络。

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的更多相关文章

  1. java基础:简单实现线程池

    前段时间自己研究了下线程池的实现原理,通过一些源码对比,发现其实核心的东西不难,于是抽丝剥茧,决定自己实现一个简单线程池,当自已实现了出一个线程池后.发现原来那么高大上的东西也可以这么简单. 先上原理 ...

  2. 简单C++线程池

    简单C++线程池 Java 中有一个很方便的 ThreadPoolExecutor,可以用做线程池.想找一下 C++ 的类似设施,尤其是能方便理解底层原理可上手的.网上找到的 demo,基本都是介绍的 ...

  3. JAVA基础知识之多线程——线程池

    线程池概念 操作系统或者JVM创建一个线程以及销毁一个线程都需要消耗CPU资源,如果创建或者销毁线程的消耗源远远小于执行一个线程的消耗,则可以忽略不计,但是基本相等或者大于执行线程的消耗,而且需要创建 ...

  4. 26、Java并发性和多线程-线程池

    以下内容转自http://ifeve.com/thread-pools/: 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个 ...

  5. 【Java分享客栈】SpringBoot线程池参数搜一堆资料还是不会配,我花一天测试换你此生明白。

    一.前言   首先说一句,如果比较忙顺路点进来的,可以先收藏,有时间或用到了再看也行:   我相信很多人会有一个困惑,这个困惑和我之前一样,就是线程池这个玩意儿,感觉很高大上,用起来很fashion, ...

  6. 转:Java Web应用中调优线程池的重要性

    不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...

  7. Java Web应用调优线程池

    最简单的单线程 我们先从基础开始.无论使用哪种应用服务器或者框架(如Tomcat.Jetty等),他们都有类似的基础实现.Web服务的基础是套接字(socket),套接字负责监听端口,等待TCP连接, ...

  8. Java Web应用中调优线程池的重要性

    不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...

  9. Java 使用new Thread和线程池的区别

    本文转至:https://www.cnblogs.com/cnmenglang/p/6273761.html , 孟凡柱的专栏 的博客,在此谢谢博主! 1.new Thread的弊端执行一个异步任务你 ...

随机推荐

  1. Random类和ThreadLocalRandom类

    Random类和ThreadLocalRandom类 Random类用于生成一个伪随机数,他有两个构造方法:一个构造方法使用默认的种子(以当前时间作为种子),另一个构造方法需要显示传入一个long型整 ...

  2. BZOJ 2758 Blinker的噩梦(扫描线+熟练剖分+树状数组)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2758 题意:平面上有n个多边形(凸包和圆).任意两个多边形AB只有两种关系:(1) ...

  3. ZOJ 2182 Cable TV Network(无向图点割-最大流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2182 题意:给出一个无向图,问最少删掉多少个顶点之后图变得不连通 ...

  4. ubuntu下读取数据库中文乱码解决

    请按如下配置myqsl.cnf (/etc/mysql/mysql.conf.d/mysql.cnf ),然后重启mysql服务,对于web程序,你可以把web所有编码都搞成utf-8[client] ...

  5. 1,linux基础知识以及新建虚拟机

    1,Windows图形界面只是在个人电脑上普及(dos界面):lunix是在服务器领域,服务器上绝对不出现图形化界面(命令行). 2,2.6.18  主板本,次版本,末版本 如果末版本积累到一定程序就 ...

  6. 迷你sql profile,给缺少sql跟踪的朋友们

    如果你的数据库没有sqlprofile,看这里. 如果你没时间装sqlserver那一系列的东西,看看这里,也许能解决呢. 这是一个迷你版的sqlprofile ,在win7下测试,链接sqlserv ...

  7. find command in linux terminal

    Say you want to search for files with keyword as "keyword". find / -name keyword 2> /de ...

  8. C# 线程(六):定时器

    From : http://kb.cnblogs.com/page/42532/ Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. ...

  9. WPF基础学习第二天(高级控件)

    1.Menu菜单控件 Exp1: Code: <Window x:Class="菜单Menu.MainWindow" xmlns="http://schemas.m ...

  10. 超实用压力测试工具-ab工具

    在学习ab工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second)概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求 ...