public class ThreadPoolManager{
private static ThreadPoolManager poolManager;
private ThreadPool pool;
static final int POOL_MIN_SIZE = 1;
static final int POOL_MAX_SIZE = 10;
private ThreadPoolManager(){
pool = new ThreadPool(POOL_MIN_SIZE,POOL_MAX_SIZE);
}
public synchronized static ThreadPoolManager getInstance() {
if(poolManager == null)
poolManager = new ThreadPoolManager();
return poolManager;
}
//Get the working thread
private ThreadWorker getWorker(){
return pool.getWorker();
}
public void doService(String jobName){
getWorker().ready(jobName);
}
}
import java.util.Stack;
class ThreadPool{
private int poolMinSize;
private int poolMaxSize;
private int accumulator = 0;
private Stack pool;
ThreadPool(int poolMinSize,int poolMaxSize){
this.poolMinSize = poolMinSize;
this.poolMaxSize = poolMaxSize;
pool = new Stack();
initializePool();
}
private void initializePool(){
ThreadWorker worker;
for(int i=0;i<poolMinSize;i++){
worker = new ThreadWorker(this,i+1);
pool.push(worker);
accumulator++;
worker.start();
}
}
public synchronized ThreadWorker getWorker(){
while(true){
if(!pool.isEmpty()){
return (ThreadWorker)pool.pop();
}
else{
if(accumulator == poolMaxSize){
try{
wait(); //main thread hangs up
}
catch(InterruptedException e){
e.printStackTrace();
}
}
else{
ThreadWorker worker = new ThreadWorker(this);
worker.start();
accumulator++;
return worker;
}
}
}
}
public synchronized boolean returnWorker(ThreadWorker worker){
if(pool.size() < poolMaxSize){
pool.push(worker);
System.out.println(worker+" has been returned!");
notify();
return true;
}
return false; // The thread pool is full filled.
}
}
class ThreadWorker extends Thread{
private ThreadPool pool;
private int workerId;
private String jobName;
private static int newAddWorkerId = ThreadPoolManager.POOL_MIN_SIZE + 1;
public ThreadWorker(ThreadPool pool){
this.pool = pool;
workerId = newAddWorkerId++;
}
public ThreadWorker(ThreadPool pool,int workerId){
this.pool = pool;
this.workerId = workerId;
}
public synchronized void ready(String jobName){
this.jobName = jobName;
notify();
}
public synchronized void run(){
while(true){
if(jobName == null){
try{
wait();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
Job job = new Job(jobName);
//main function
job.execute(workerId);
jobName = null;
if(!pool.returnWorker(this))
break;
}
}
public String toString(){
return "Worker "+workerId;
}
}
class Job {
private String jobName;
public Job(String jobName){
this.jobName = jobName;
}
public void execute(int workerId){
System.out.println("No."+workerId+" is doing the job '"+jobName+"'");
try{
Thread.sleep(500);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
转自:http://hi.baidu.com/triceratops/blog/item/ac7e89114dcf7017b8127b4e.html
分享到:
相关推荐
NULL 博文链接:https://yulincqupt.iteye.com/blog/1673919
目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...
主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧,需要的朋友可以参考下
主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java 线程池示例 一个简单的 Java 线程池示例
NULL 博文链接:https://technicalsearch.iteye.com/blog/2008646
这段代码实现了一个简单的线程池ExecutorService,其中使用了Java的匿名内部类。...这个简单的示例代码展示了如何使用Java匿名内部类来实现一个线程池的简单功能,方便了对多线程任务的管理和执行。
主要介绍了Spring Boot整合FTPClient线程池的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了java 定时器线程池(ScheduledThreadPoolExecutor),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
通过剖析Java中线程池的原理,解读Java线程池源码,并给出线程池调用的示例,帮助理解线程池的基本原理。
线程池示例(包含自定义拒绝策略),演示了如何创建一个线程池,以及添加到队列的过程,先添加到工作线程,然后是缓存队列,最后是创建临时线程
当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。 为什么要用线程池: 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务 可以根据系统的...
目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...
volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小例子:多个线程竞争问题、多个线程多个锁问题、创建一个缓存的线程池、多线程使用Vector或者HashTable的示例(简单线程同步...
主要介绍了java 注解实现一个可配置线程池的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring Boot中内置了多种线程池,为应用程序提供快速响应和高吞吐量的运行环境。线程池在Spring Boot中起...深入理解Spring Boot中的线程池,并根据实际需求进行合理的配置和使用,是每个Spring Boot开发者的必备技能。
主要介绍了Java 线程池详解及创建简单实例的相关资料,需要的朋友可以参考下
一个关于java 线程池的例子,也适合android
提供工厂方法来创建不同类型的线程池,这篇文章主要介绍了Java ThreadPoolExecutor 线程池的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...