`
ThinkInMyLife
  • 浏览: 48775 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用java实现线程池的一个简单示例[转的]

阅读更多
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

 

 

分享到:
评论

相关推荐

    Java8并行流中自定义线程池操作示例

    并行流Parallel Stream我们先以一个简单的例子来开始-在任一个Collection类型上调用parallelStream方法-它将返回一个可能的并行流。这种流的默认处理流程是使用ForkJoinPool.commonPool(),这是一个被整个应用程序所...

    java 线程池示例(自己实现的参考别人的代码)

    NULL 博文链接:https://yulincqupt.iteye.com/blog/1673919

    一个通用的Java线程池类

    目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    我们也将遵循这个设计,实现一个简单的线程池类`SampleThreadPoolExecutor`,它继承自`Executor`接口。 在`SampleThreadPoolExecutor`类中,我们需要关注以下几个关键属性: 1. `wc`: 工作中的线程数量 2. `...

    Java实现的线程池、消息队列功能

    这篇博客"Java实现的线程池、消息队列功能"似乎提供了关于如何在Java中实现这两种功能的源码示例。尽管描述部分为空,但从提供的文件名我们可以推测,`CodeReader.java`和`SourcePathManager.java`可能包含了读取和...

    Java线程池使用说明

    例如,在代码示例中,使用Executors.newSingleThreadExecutor()创建了一个单线程线程池,并且通过pool.execute(t1);等方法提交了多个任务到线程池中执行。最后,通过调用pool.shutdown()方法来关闭线程池,释放相关...

    SpringBoot线程池详解含完整示例(值得珍藏)

    1. SingleThreadExecutor:这个线程池仅使用一个线程来执行所有任务,确保任务按提交顺序执行,不会发生并发,适合于任务之间需要保持执行顺序的场景。 2. FixedThreadPool:固定容量的线程池,核心线程数等于最大...

    java线程池threadpool简单使用源码

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...

    Java线程池介绍以及简单示例

    NULL 博文链接:https://technicalsearch.iteye.com/blog/2008646

    JAVA线程池的原理与实现.pdf

    示例代码中的`ThreadPool`类是一个简单的线程池实现,包含一个`LinkedList`作为任务队列,以及若干个工作线程。工作线程通过继承`Thread`并实现`Runnable`接口来完成任务。在实际应用中,Java标准库提供的`...

    Java线程池文档

    Java代码中展示的`ThreadPool`类是作者实现的一个简单线程池示例,使用了`LinkedList`作为工作队列,`ThreadPool`类继承了`ThreadGroup`,这在JDK 1.4版本中是一种常见实现方式。但在JDK 1.5及以上版本,推荐使用`...

    Spring Boot整合FTPClient线程池的实现示例

    Spring Boot 整合 FTPClient 线程池的实现示例 在本文中,我们将探讨如何在 Spring Boot 项目中整合 FTPClient 线程池的实现示例。FTPClient 是一个常用的 FTP 客户端库,而线程池则可以帮助我们减少频繁创建和销毁...

    线程池的实现(JAVA)

    线程池是Java多线程编程中的一个重要概念,它是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效地控制运行的线程数量,当线程空闲时,会进行回收,这样可以减少...

    使用Vector实现简单线程池

    在这样的实现中,`Vector`可以用来存储待执行的任务,每个任务通常是一个实现了`Runnable`接口的对象。线程池的核心操作包括: 1. **任务提交**:当有新任务需要执行时,将其添加到`Vector`中。 2. **任务调度**:...

    java socket线程池

    在给出的代码示例中,我们看到了一个使用线程池实现的简单EchoServer程序。这个程序通过一个ExecutorService来处理网络通信中的多线程需求。ExecutorService是一个线程池接口,它继承了Executor接口,并提供了一些...

    Java-Thread-Pool-example:一个简单的 Java 线程池示例

    在这个"Java-Thread-Pool-example"中,我们将深入探讨Java线程池的实现、优势以及如何使用它。 Java中的线程池是通过`java.util.concurrent`包下的`ExecutorService`接口和`ThreadPoolExecutor`类来实现的。`...

    线程池使用示例(含源代码)

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过维护一组可重用线程来提高程序的性能和响应速度。在Java中,我们可以使用`java.util.concurrent`包下的`ExecutorService`接口及其实现类,如`...

    JAVA线程池例子

    Java线程池是一种高效管理线程资源的技术,它允许开发者创建一组可重用的工作线程,从而避免频繁地创建和销毁线程带来的性能开销。线程池在Java中主要通过`java.util.concurrent`包中的`ExecutorService`接口及其...

    Java几种线程池类型介绍及使用.docx

    Java线程池的核心接口是`ExecutorService`,它是`Executor`接口的一个实现,提供了更丰富的线程管理功能。`ExecutorService`可以管理和调度任务,支持定时执行、定期执行以及并发数控制等高级特性。在Java中,线程池...

Global site tag (gtag.js) - Google Analytics