`

一个线程池的实现

阅读更多
线程池使用背景:当有大批量的任务在一个时间段需要执行的时候,为了控制开辟的线程数量,节约资源,就应该考虑到线程池的使用。

由此想到的一个关于程序级别的性能调优问题,说到多线程这里,当有复杂而且耗时的任务需要处理的时候,首先应考虑到使用多线程进行并发处理,但当需要处理的任务数量特别多的情况下,又应该开始考虑到线程池的使用以控制开启的线程数量。

下面是一个线程池的具体实现:

import java.util.LinkedList;

import org.apache.log4j.Logger;




public class ThreadPoolMage {

/**
* 线程池中线程个数
*/
private final int nThreads;

/**
* 存放线程
*/
private final PoolWorker[] threads;

private static ThreadPoolMage  PoolObj = null;

/**
* 事件队列
*/
private final LinkedList queue;

public static ThreadPoolMage getInstance(int nThreads) {
    if (PoolObj==null){
    PoolObj = new ThreadPoolMage(nThreads);
    }
    return PoolObj ;
  }

private static final Logger logger = Logger
.getLogger(ThreadPoolMage.class);

/**
* 构造函数
*
* @param nThreads
*            线程个数
*/
private ThreadPoolMage(int nThreads) {

logger.info("ThreadPoolManager run");
this.nThreads = nThreads;
queue = new LinkedList();
if (System.getProperty("nthread")!=null){
try{
nThreads = Integer.parseInt(System.getProperty("nthread"));
}catch(Exception ex){

}
}

threads = new PoolWorker[nThreads];
logger.info("start the thread");
// 启动线程
for (int i = 0; i < nThreads; i++) {
logger.info("Start thread : " + i);
threads[i] = new PoolWorker(i);
threads[i].start();
}
}

/**
* 入队
*
* @param r
*            需要入队的事件,供外部调用,加入需要执行的任务
*/
public void execute(Runnable r) {
synchronized (queue) {
logger.info("add runnable into queue");
// 加入队列
queue.addLast(r);
// 通知正在阻塞的线程
queue.notify();
}
}

public void close() {
for (int i = 0; i < threads.length; i++) {
PoolWorker aWorker = threads[i];
aWorker.close();
}
synchronized (queue) {
queue.notifyAll();
}
}

/**
* <p>
* Title: PoolWorker
* </p>
* <p>
* Description: 线程池中的线程
* </p>
* <p>
*/

public class PoolWorker extends Thread {

private int threadNumber;

public PoolWorker(int threadNumber) {
this.threadNumber = threadNumber;
}

public int getThreadNumber() {
return threadNumber;
}

private boolean isFinished = false;

public void close() {
isFinished = true;
}

/**
* 线程运行函数
*/
public void run() {
// DebugPrint.printThreadDebug("PoolWork thread begin to run");
Runnable r;
while (!isFinished) {
synchronized (queue) {
// 如果队列为空,等
while (queue.isEmpty()) {
try {
/*
* DebugPrint .printThreadDebug("queue is empty,
* begin waiting");
*/
if(isFinished) {
return;
}
queue.wait();
} catch (InterruptedException ignored) {
// 捕到异常就忽略
/*
* DebugPrint .printThreadDebug("There is an
* exception, ignored it");
* DebugPrint.printException(ignored);
*/}
}
/*
* DebugPrint .printThreadDebug("Now queue isn't empty,
* begin running");
*/// 不空的时候,从队中取出一个事件
r = (Runnable) queue.removeFirst();
}
try {
// logger.info("begin to run the runnable");
// 执行这个事件
r.run();
Thread tt = new Thread();

} catch (Throwable e) {
// You might want to log something here
// 所有的异常全忽略
logger.error(
"there are a runtime exception in run the runable",
e);

}
}
}
}
}
分享到:
评论

相关推荐

    windows 版本的一个线程池实现,支持普通任务,定时任务,可以保证排队的任务正确释放-ThreadPool.zip

    本项目"ThreadPool.zip"提供了一个自定义的线程池实现,特别针对Windows平台,它支持普通任务和定时任务,并能确保排队任务的正确释放。 线程池的工作原理: 1. **线程池初始化**:线程池在启动时会预先创建一定...

    一个简单线程池的实现

    在这个简单的线程池实现中,我们可以通过`pthread_pool.cpp`、`MainFunctionForTest.cpp`、`twork_work.cpp`、`pthread_pool.h`和`twork_work.h`这五个文件来理解其基本架构和工作原理。 首先,`pthread_pool.h`...

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

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

    简单C++线程池实现

    本文将深入探讨如何实现一个简单的线程池,并通过提供的文件名`_threadpool.cpp`, `_promain.cpp`, `_threadpool.h`来解释其核心概念和组件。 首先,`_threadpool.h`是头文件,通常包含类定义和相关函数声明。...

    Django异步任务线程池实现原理

    Django异步任务线程池实现原理主要涉及以下几个核心知识点: 1. 异步任务执行原理: 当Django应用在处理耗时的任务时,通常会阻塞主线程,导致用户在等待处理结果时无法进行其他操作。为了解决这个问题,Django采用...

    fluffyThreadPool:Java中的另一个线程池实现

    Java中的另一个线程池实现。 该线程池将创建给定数量的工作线程并将它们全部空闲。 可以将任务作为可运行对象分配给池。 如果有一个空闲的工作程序,它将立即执行可运行程序。 如果不是,则将可运行对象添加到队列...

    基于UNIX C语言的一种线程池实现.pdf

    "基于UNIX C语言的一种线程池实现",这篇文章介绍了在UNIX操作系统下使用C语言实现的一个线程池方案。线程池是一种常用的设计模式,能够提高系统的性能和可扩展性。 二、线程池的重要性 线程池是现代软件系统中常用...

    Linux C系统编程:使用线程池实现cp命令

    本文将深入探讨如何利用线程池来实现一个类似于`cp`命令的功能,即高效地进行文件复制。 首先,线程池是一种多线程编程模型,它预先创建一组线程,当有任务需要执行时,不再创建新的线程,而是从线程池中选择一个...

    c++线程池实现原理分析

    ### C++线程池实现原理分析 #### 一、引言 线程池是一种软件设计模式,用于管理和控制大量线程的创建与销毁,尤其是在处理大量短期任务时,它可以显著提高程序性能。线程池的核心思想是预先创建一组线程,并让它们...

    线程池原理及创建(C++实现)

    4. **任务接口 (CJob)**:这是一个抽象基类,定义了一个`Run`方法,所有的任务类都需要从它继承并实现这个方法。`Run`方法包含任务的具体逻辑。 5. **任务队列**:用于存储待处理任务的数据结构。线程池中的工作线程...

    一个linux下的socket线程池实现

    总之,"一个Linux下的socket线程池实现"是一个综合性的网络编程项目,涵盖了socket通信、多线程管理和资源调度等多个重要知识点。对于想要深入学习Linux网络编程和并发控制的开发者来说,这是一个极好的实践案例。

    Python的线程池实现

    总之,`ThreadPool.py`的源码为我们提供了一个学习和理解线程池实现的好机会。通过阅读和分析源码,我们可以了解到线程池在Python中的工作原理,以及如何根据需求进行定制化开发。这对于提升并发编程和系统优化的...

    在spring boot中使用java线程池ExecutorService的讲解

    ThreadPoolExecutor 是 Java 中的一个线程池实现类,它提供了四个构造方法,每个构造方法都可以用来创建一个线程池。其中,最后一个构造方法是最全的,它包括以下四个参数: 1. corePoolSize:核心线程数,表示...

    线程池实现,通过C语言实现

    它维护一个线程池,其中包含若干个待命的工作线程。 2. **工作线程**:工作线程是线程池中的基本执行单元,它们在接收到任务后进行处理,处理完后返回线程池等待新的任务。 3. **任务队列**:所有待处理的任务都会...

    通过EasyExcel+线程池实现百万级数据从Excel导入到数据库

    在处理大量数据导入数据库的场景中,使用...通过以上步骤,可以利用EasyExcel和线程池实现百万级数据从Excel导入到数据库的功能。这种方式可以提高数据处理的效率,减少内存占用,并且能够更好地利用多核CPU的优势。

    C++实现线程池详解(基于boost源码以及封装等线程池)

    一、要实现高效的线程池,可以考虑以下几点 二、实现线程池可以按照以下步骤进行 三、简单的C++线程池代码示例 四、 基于boost编写的源码库 - 线程池 4.1 基于boost编写的源码库地址 4.2 boost线程池的先进先出、...

    基于win32的C++线程池实现

    在计算机编程领域,线程池是一种多线程处理形式,预先创建了多个线程,等待处理一批特定的任务,而不是为每个任务创建一个新的线程。线程池的主要优势在于减少线程创建和销毁的开销,同时能更好地控制系统的资源消耗...

    socket 线程池实现(已经在项目中应用)

    线程池是多线程编程中的一个重要概念,它能够有效地管理并发任务,提高系统资源的利用率。本篇文章将深入讲解如何在Socket服务端实现线程池,以及其在实际项目中的应用。 首先,我们来看`SocketServer.java`。这个...

    Windows自带的线程池的实现

    线程池是现代操作系统中一个重要的并发编程概念,它在Windows操作系统中被广泛使用,以提高系统资源的利用率和性能。线程池是由操作系统维护的一组预创建的线程,这些线程可供多个任务共享,而不是为每个任务创建新...

    Java版线程池实现

    不过,上述代码展示的是一个自定义的线程池实现,它可能没有使用Java标准库中的`ExecutorService`。 这个自定义线程池的实现包括以下几个关键组件: 1. **线程池参数**: - `reserve`:保留线程数,这些线程不...

Global site tag (gtag.js) - Google Analytics