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
分享到:
相关推荐
并行流Parallel Stream我们先以一个简单的例子来开始-在任一个Collection类型上调用parallelStream方法-它将返回一个可能的并行流。这种流的默认处理流程是使用ForkJoinPool.commonPool(),这是一个被整个应用程序所...
NULL 博文链接:https://yulincqupt.iteye.com/blog/1673919
目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...
我们也将遵循这个设计,实现一个简单的线程池类`SampleThreadPoolExecutor`,它继承自`Executor`接口。 在`SampleThreadPoolExecutor`类中,我们需要关注以下几个关键属性: 1. `wc`: 工作中的线程数量 2. `...
这篇博客"Java实现的线程池、消息队列功能"似乎提供了关于如何在Java中实现这两种功能的源码示例。尽管描述部分为空,但从提供的文件名我们可以推测,`CodeReader.java`和`SourcePathManager.java`可能包含了读取和...
例如,在代码示例中,使用Executors.newSingleThreadExecutor()创建了一个单线程线程池,并且通过pool.execute(t1);等方法提交了多个任务到线程池中执行。最后,通过调用pool.shutdown()方法来关闭线程池,释放相关...
1. SingleThreadExecutor:这个线程池仅使用一个线程来执行所有任务,确保任务按提交顺序执行,不会发生并发,适合于任务之间需要保持执行顺序的场景。 2. FixedThreadPool:固定容量的线程池,核心线程数等于最大...
Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...
NULL 博文链接:https://technicalsearch.iteye.com/blog/2008646
示例代码中的`ThreadPool`类是一个简单的线程池实现,包含一个`LinkedList`作为任务队列,以及若干个工作线程。工作线程通过继承`Thread`并实现`Runnable`接口来完成任务。在实际应用中,Java标准库提供的`...
Java代码中展示的`ThreadPool`类是作者实现的一个简单线程池示例,使用了`LinkedList`作为工作队列,`ThreadPool`类继承了`ThreadGroup`,这在JDK 1.4版本中是一种常见实现方式。但在JDK 1.5及以上版本,推荐使用`...
Spring Boot 整合 FTPClient 线程池的实现示例 在本文中,我们将探讨如何在 Spring Boot 项目中整合 FTPClient 线程池的实现示例。FTPClient 是一个常用的 FTP 客户端库,而线程池则可以帮助我们减少频繁创建和销毁...
线程池是Java多线程编程中的一个重要概念,它是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效地控制运行的线程数量,当线程空闲时,会进行回收,这样可以减少...
在这样的实现中,`Vector`可以用来存储待执行的任务,每个任务通常是一个实现了`Runnable`接口的对象。线程池的核心操作包括: 1. **任务提交**:当有新任务需要执行时,将其添加到`Vector`中。 2. **任务调度**:...
在给出的代码示例中,我们看到了一个使用线程池实现的简单EchoServer程序。这个程序通过一个ExecutorService来处理网络通信中的多线程需求。ExecutorService是一个线程池接口,它继承了Executor接口,并提供了一些...
在这个"Java-Thread-Pool-example"中,我们将深入探讨Java线程池的实现、优势以及如何使用它。 Java中的线程池是通过`java.util.concurrent`包下的`ExecutorService`接口和`ThreadPoolExecutor`类来实现的。`...
线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过维护一组可重用线程来提高程序的性能和响应速度。在Java中,我们可以使用`java.util.concurrent`包下的`ExecutorService`接口及其实现类,如`...
Java线程池是一种高效管理线程资源的技术,它允许开发者创建一组可重用的工作线程,从而避免频繁地创建和销毁线程带来的性能开销。线程池在Java中主要通过`java.util.concurrent`包中的`ExecutorService`接口及其...
Java线程池的核心接口是`ExecutorService`,它是`Executor`接口的一个实现,提供了更丰富的线程管理功能。`ExecutorService`可以管理和调度任务,支持定时执行、定期执行以及并发数控制等高级特性。在Java中,线程池...