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

简单的线程池

    博客分类:
  • java
阅读更多
import java.util.LinkedList;

/**
 * 线程池类
 */
public class ThreadPool extends ThreadGroup {
    private boolean isClosed = false; //线程池是否关闭
    private LinkedList workQueue; //工作队列
    private static int threadPoolID = 1; //线程池的id

    public ThreadPool(int poolSize) { //poolSize 表示线程池中的工作线程的数量

        super(threadPoolID + ""); //指定ThreadGroup的名称
        setDaemon(true); //继承到的方法,设置是否守护线程池
        workQueue = new LinkedList(); //创建工作队列
        for (int i = 0; i < poolSize; i++) {
            new WorkThread(i).start(); //创建并启动工作线程,线程池数量是多少就创建多少个工作线程
        }
    }

    /** 向工作队列中加入一个新任务,由工作线程去执行该任务 */
    public synchronized void execute(Runnable task) {
        if (isClosed) {
            throw new IllegalStateException();
        }
        if (task != null) {
            workQueue.add(task);//向队列中加入一个任务
            notify(); //唤醒一个正在getTask()方法中待任务的工作线程
        }
    }

    /** 从工作队列中取出一个任务,工作线程会调用此方法 */
    private synchronized Runnable getTask(int threadid) throws InterruptedException {
        while (workQueue.size() == 0) {
            if (isClosed)
                return null;
            System.out.println("工作线程" + threadid + "等待任务...");
            wait(); //如果工作队列中没有任务,就等待任务
        }
        System.out.println("工作线程" + threadid + "开始执行任务...");
        return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除
    }

    /** 关闭线程池 */
    public synchronized void closePool() {
        if (!isClosed) {
            waitFinish(); //等待工作线程执行完毕
            isClosed = true;
            workQueue.clear(); //清空工作队列
            interrupt(); //中断线程池中的所有的工作线程,此方法继承自ThreadGroup类
        }
    }

    /** 等待工作线程把所有任务执行完毕 */
    public void waitFinish() {
        synchronized (this) {
            isClosed = true;
            notifyAll(); //唤醒所有还在getTask()方法中等待任务的工作线程
        }
        Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。
        int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程
        for (int i = 0; i < count; i++) { //等待所有工作线程结束
            try {
                threads[i].join(); //等待工作线程结束
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 内部类,工作线程,负责从工作队列中取出任务,并执行
     * 
     * @author sunnylocus
     */
    private class WorkThread extends Thread {
        private int id;

        public WorkThread(int id) {
            //父类构造方法,将线程加入到当前ThreadPool线程组中
            super(ThreadPool.this, id + "");
            this.id = id;
        }

        public void run() {
            while (!isInterrupted()) { //isInterrupted()方法继承自Thread类,判断线程是否被中断
                Runnable task = null;
                try {
                    task = getTask(id); //取出任务
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                //如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
                if (task == null)
                    return;

                try {
                    task.run(); //运行任务
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }// end while
        }// end run
    }// end workThread
}
 

 

 

这是个无限队列长度的线程池,同时可以设定线程池的队列等待长度,以及出现超出处理能力后的处理方式。下面学习下JDK自带的线程池的demo~

0
0
分享到:
评论

相关推荐

    这是一个使用C++实现的简易线程池.zip

    这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易...

    一个简单线程池的实现

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

    简单线程池与线程池检查的实现

    标题 "简单线程池与线程池检查的实现" 涉及到的是计算机编程中的多线程管理和优化,特别是线程池的概念及其检查机制。线程池是一种多线程处理形式,预先创建一定数量的线程,放入池中,当有任务需要执行时,直接从池...

    C++11 简易线程池实现

    简易的C++11线程池实现,线程池为固定方式,后面会新增非固定模式。

    C++简单线程池设计

    在这个“C++简单线程池设计”的主题中,我们将探讨如何使用GCC编译器以及如何将其改编为Visual Studio(VS)环境,并利用pthread线程库和curl网络库来实现这一功能。 首先,pthread是POSIX标准定义的一个线程接口,...

    使用Vector实现简单线程池

    然而,如果我们想要从头开始理解线程池的工作原理,或者在特定场景下自定义线程池的行为,那么使用`Vector`来实现简单的线程池是一个很好的学习实践。 标题"使用Vector实现简单线程池"指的是将Java中的`Vector`类...

    c++简易线程池

    标题"简易线程池"暗示这是一个简单的实现,可能适合初学者学习和理解线程池的工作原理。线程池的实现通常包括以下几个关键组件: 1. **任务队列**:线程池维护一个任务队列,用于存放待处理的任务。任务可以是函数...

    C语言实现简单线程池.zip

    在本项目"简单线程池"中,我们将重点探讨如何用C语言在Linux环境下实现这样一个线程池系统,特别是关注其核心组件和设计原则。 首先,线程池的核心概念是线程复用,通过预先创建一组线程,可以避免频繁地创建和销毁...

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    C语言实现的简单线程池

    C语言实现的简单线程池

    C++简单线程池例子

    这个“C++简单线程池例子”提供了实现线程池的一个实例,通过分析`TestMyThreadPool.cpp`文件,我们可以学习如何设计和使用线程池。 1. **线程池概念**:线程池是由一组预先创建的线程组成的,这些线程等待接收任务...

    基于C++17实现的简易线程池源码(含超详细注释+知识说明文档).zip

    【项目介绍】基于C++17的简易线程池任务描述- 实现多线程安全的任务队列,线程池使用异步操作,提交(submit)使用与thread相同。- 内部利用完美转发获取可调用对象的函数签名,lambda与function包装任务,使用RAII...

    19 自己动手丰衣足食—简单线程池实现.pdf

    【标题】:19 自己动手丰衣足食—简单线程池实现 【描述】:本章节将探讨Java并发编程中的线程池实现,通过自己动手创建一个简单的线程池,来理解线程池的工作原理及其优势。 【知识点详解】: 1. **线程池的必要...

    【并发编程】自定义简单线程池.pdf

    ### 并发编程之自定义简单线程池详解 #### 基本概念与理论基础 **并发编程**是现代软件开发中一个重要的领域,它允许程序中的多个任务同时运行,从而提高系统的响应速度和吞吐量。在并发编程中,涉及到几个基本的...

    用C ++ 11和Folly实现的简单线程池(facebook C ++基础库).zip

    在这个项目中,我们将探讨如何使用C++11标准库和Facebook的Folly库来实现一个简单的线程池。 C++11引入了多线程支持,包括`std::thread`类,允许开发者创建和管理线程。但是,仅仅使用`std::thread`构建线程池会...

    c++简单线程池的实现

    本文将深入探讨如何在Visual Studio 2015(VS2015)环境下实现一个简单的线程池,并解析提供的`TestThreadPool.sln`解决方案和`TestThreadPool`源代码文件。 线程池的基本思想是维护一组预先创建的线程,这些线程...

    易语言真正的线程池简易实现

    易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...

    简单线程池实现,凑字数

    一个简单的线程池实现通常包括以下几个关键部分: 1. **线程池初始化**:创建线程池时,需要设定一些参数,如核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、线程存活时间(keepAliveTime)以及单位...

Global site tag (gtag.js) - Google Analytics