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

一个完整的线程池的实例

    博客分类:
  • java
阅读更多
线程池用一个双向链表来表示,池中的元素是处于休眠状态的工作线程。ThreadPool类大部分工作都是来维护这个双向链表,当有新的请求到达时,先从表头摘取一个工作线程,将其唤醒转入工作状态。如果线程池为空,则创建一个新的工作线程。
/**
* free software
* from apusic
* by www.cn-java.com 2001
*/
import java.util.LinkedList;

public class ThreadPool
{
static final long IDLE_TIMEOUT = 60000L;

private String name;
private int minsize;
private int maxsize;
private int nextWorkerId = 0;
private LinkedList pool = new LinkedList();

public ThreadPool() {
this("PooledThread");
}

public ThreadPool(String name) {
this(name, 0, 20);
}

public ThreadPool(String name, int minsize, int maxsize) {
this.name = name;
this.minsize = minsize;
this.maxsize = maxsize;
}

public synchronized void run(Runnable runner) {
Worker worker;

if (runner == null) {
throw new NullPointerException();
}

// get a worker from free list...
if (!pool.isEmpty()) {
worker = (Worker) pool.removeFirst();
} else {
// ...no free worker available, create new one...
worker = new Worker(name + "-" + ++nextWorkerId);
worker.start();
}

// ...and wake up worker to service incoming runner
worker.wakeup(runner);
}

// Notified when a worker has idled timeout
// @return true if worker should die, false otherwise
synchronized boolean notifyTimeout(Worker worker) {
if (worker.runner != null) {
return false;
}
if (pool.size() > minsize) {
// Remove from free list
pool.remove(worker);
return true; // die
}
return false; // continue
}

// Notified when a worker has finished his work and
// free to service next runner
// @return true if worker should die, false otherwise
synchronized boolean notifyFree(Worker worker) {
if (pool.size() < maxsize) {
// Add to free list
pool.addLast(worker);
return false; // continue
}
return true; // die
}

// The inner class that implement worker thread
class Worker extends Thread {
Runnable runner = null;

public Worker(String name) {
super(name);
}

synchronized void wakeup(Runnable runner) {
this.runner = runner;
notify();
}

public void run() {
for (;;) {
synchronized (this) {
if (runner == null) {
try {
wait(IDLE_TIMEOUT);
} catch (InterruptedException e) {}
}
}

// idle timed out, die or put into free list
if (runner == null) {
if (notifyTimeout(this))
return;
else
continue;
}

try {
runner.run();
} finally {
runner = null;
if (notifyFree(this))
return;
}
}
}
}
}

分享到:
评论

相关推荐

    java 四种线程池实例

    3. **SingleThreadExecutor**: `Executors.newSingleThreadExecutor()`创建一个只有一个线程的线程池,所有任务都会按照提交的顺序串行执行。这个线程池适用于需要保证执行顺序的场景,比如日志记录或者数据库事务。...

    spring 线程池实例

    线程池是多线程编程中的一个重要概念,它能够有效地管理并发任务的执行,提高系统的性能和效率。本实例将深入探讨Spring中的线程池实现,包括其工作原理、配置方式以及如何在实际应用中使用。 首先,我们要理解...

    C++线程池实例

    总结来说,“C++线程池实例”是一个展示了如何在C++环境中,特别是在较旧的编译器如VC6.0下,利用线程池来实现并发任务处理的例子。通过理解和实践这个实例,开发者可以更好地理解线程池的原理和使用,提高软件的...

    Qt实现线程池开发实例

    本实例将探讨如何使用Qt实现一个线程池,并结合QTcpSocket进行网络通信。 **线程池的概念与作用** 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池预先创建...

    一个简单的线程池例子

    线程池是多线程编程中的一个重要概念,它在Windows操作系统以及其他支持多线程操作系统的环境中广泛应用。线程池是一种管理线程资源的有效方式,通过预先创建并维护一定数量的线程来处理任务,而不是每次需要执行新...

    VC写的一个线程池的管理实例

    在这个"VC写的一个线程池的管理实例"中,我们可以深入理解线程池的工作原理以及如何在VC环境中构建和管理它。 1. **线程池的基本原理**: 线程池是由一组预创建或按需创建的线程组成的,这些线程等待接收任务并...

    线程池实例(Linux)

    5. **线程池的实现方式**:在C/C++中,可以通过自定义数据结构来实现线程池,如维护一个线程数组和任务队列,同时实现线程调度算法。Java中,`java.util.concurrent.ThreadPoolExecutor`提供了内置的线程池实现。 6...

    java线程池实例详细讲解

    1. **工作队列(Work Queue)**:线程池内部维护了一个任务队列,用于存储待执行的任务。当新任务到来时,如果线程池中的工作线程数量未达到最大值,那么任务会被立即分配给一个工作线程执行;否则,任务会被放入...

    VC简单的线程池使用实例

    1.线程池管理器(ThreadPoolManager):用于创建并管理...网上的c/c++线程池多是linux下的,这个是VC6.0的线程池。其涉及的主要文件有:ThreadPoolManage、IThreadExcute、TemporarilyThread、ThreadManage、RegKeyIni。

    Java线程池实例

    简单实用的java线程池实例代码。包括测试代码和工程文件。

    delphi线程池实例

    当你创建一个新的TTask实例并调用其Start方法时,任务会被添加到线程池的任务队列中。线程池会检查当前是否有空闲线程,如果有,就立即执行任务;如果没有,任务会被挂起,直到有线程完成其他任务并变得可用。...

    java线程池实例

    在实际开发中,Java还提供了一些预定义的线程池,如`Executors.newFixedThreadPool(int nThreads)`创建固定大小的线程池,`Executors.newSingleThreadExecutor()`创建只有一个线程的线程池等。这些预定义的线程池...

    Windows下一个比较完美的线程池实现和示例

    Windows下一个比较完美的线程池实现和示例 本线程池提供了如下功能: 1.能根据任务个数和当前线程的多少在最小/最大线程个数之间自动调整(Vista后的系统有 SetThreadpoolThreadMaximum 等函数有类似功能); 2.能方便...

    多线程线程池实例及相关资料

    当有新任务到来时,线程池会分配一个空闲的线程去处理,而不是每次都创建新的线程。这样可以减少线程创建和销毁的开销,提高系统效率。在C++中,虽然标准库没有内置的线程池实现,但我们可以利用`std::future`和`std...

    delphi线程池mcpage实例

    MCPageCheck可能是这个实例中用到的一个特定模块或组件,可能用于检查或处理数据页。 线程池的核心概念是预先创建一组线程,这些线程在需要时被复用,而不是每次执行新任务时都创建新的线程。在Delphi中,我们可以...

    C#线程池实例 线程池和文件下载服务器

    在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些数据可能会有变化) 下载文件服务器的...

    线程池使用实例,一个简单的使用线程池的例子

    线程池使用实例,一个简单的使用线程池的例子

    java中通用的线程池实例代码

    Java 中通用的线程池实例代码是指在 Java 编程语言中创建一个通用的线程池实例,以便于在多线程环境下高效地执行任务。下面是该线程池实例代码的详细解释: 一、线程池的概念 在 Java 中,线程池是一个池子,里面...

    DELPHI的ThreadPool的线程池DEMO

    - **线程池**:是一组预创建的线程,它们共享一个工作队列,等待分配的任务被添加到队列中。线程池中的线程会自动从队列中取出任务并执行,当所有线程都在执行任务时,新任务会被放入队列等待。 2. **DELPHI线程池...

Global site tag (gtag.js) - Google Analytics