`
357029540
  • 浏览: 726205 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

自定义线程池简单介绍

    博客分类:
  • JAVA
阅读更多

       线程池的相关概念就不在这里说明了,百度一下有很多,这里简单表述一下如何实现一个自定义的线程池就行线程管理,我们如果要实现一个线程池对线程的管理,那么需要实现一下几点的思路:

1.如何管理线程

2.如何定义工作线程以及工作线程如何持续的保持运行状态

3.如何定义线程池大小及队列大小

4.如何提供接口给调用者使用

5.如何关闭线程池中的线程

接下来我们就一一的实现这几个问题。

1.我们需要定义一个队列来来管理线程,这里使用了LinkedBlockingQueue

// 1.定义一个存储线程队列
private LinkedBlockingQueue<Runnable> queue;

 2.因为是一个简单的测试,所以我们可以先定义一个内部类来实现工作线程

// 2.定义工作线程进行线程的执行
    class Worker extends Thread {

        private SelfThreadPoolExecutor threadPoolExecutor;

        public Worker(SelfThreadPoolExecutor poolExecutor) {
            this.threadPoolExecutor = poolExecutor;
        }

        @Override
        public void run() {
            Runnable task;
            while (threadPoolExecutor.receiveTask || threadPoolExecutor.queue.size() > 0) {
                try {
                    // 有线程则取出来,否则等待
                    System.out.println("准备消费线程");
                    task = threadPoolExecutor.queue.take();
                    if (task != null) {
                        task.run();
                        System.out.println("消费线程");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

 SelfThreadPoolExecutor是外部定义的整体类名

3.使用有参的构造方法进行线程池大小的管理

// 3.存放工作线程的集合
    private List<Worker> workerList;

    // 4.线程池初始化
    public SelfThreadPoolExecutor(int coreSize, int queueSize) {
        if (coreSize <= 0 || queueSize <= 0) {
            throw new IllegalArgumentException("参数不正确");
        }
        this.queue = new LinkedBlockingQueue<>(queueSize);
        // 线程安全的集合
        this.workerList = Collections.synchronizedList(new ArrayList<>());
        for (int i = 0; i < coreSize; i++) {
            Worker worker = new Worker(this);
            worker.start();
            workerList.add(worker);
        }
    }

4.定义阻塞和非阻塞的方式提供对应的接口

// 5.非阻塞的方法接口
    public boolean offer(Runnable task) {
        if (receiveTask) {
            return queue.offer(task);
        } else {
            return false;
        }
    }

    // 6.阻塞的方法接口
    public void put(Runnable task) {
        try {
            if (receiveTask) {
                queue.put(task);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

6.进行线程池的关闭

// 7.线程池的关闭
    private boolean receiveTask = true;

    public void shutdown() {
        // 7.1.队列不再接收线程
        receiveTask = false;
        // 7.2.关闭处于wait或block的线程
        for (Thread thread : workerList) {
            if (Thread.State.BLOCKED.equals(thread.getState())
            || Thread.State.WAITING.equals(thread.getState())
            || Thread.State.TIMED_WAITING.equals(thread.getState())){
                thread.interrupt();
            }
        }
    }

 我们测试的方法如下:

public static void main(String [] args){
        SelfThreadPoolExecutor selfThreadPoolExecutor = new SelfThreadPoolExecutor(5,10);
        for(int i = 0;i < 20;i++){
            Runnable task = () ->{
                System.out.println("开启线程");
            };
            selfThreadPoolExecutor.put(task);
        }
        selfThreadPoolExecutor.shutdown();
    }

 运行结果是:

准备消费线程
准备消费线程
准备消费线程
准备消费线程
准备消费线程
开启线程
消费线程
准备消费线程
开启线程
消费线程
准备消费线程
开启线程
消费线程
准备消费线程
。。。。。。

 整体代码见附件。

 

0
0
分享到:
评论

相关推荐

    Android编程自定义线程池与用法示例

    主要介绍了Android编程自定义线程池与用法,结合实例形式分析了Android线程池的功能、定义及简单使用方法,需要的朋友可以参考下

    自定义线程池

    自定义的线程池DLL,使用方法很简单

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等... ConcurrentLinkedQueue、DelayQueue示例、自定义的线程拒绝策略、自定义线程池(使用有界队列)、自定义线程池(使用无界队列)。。。

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

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    【更新】【Windows下对Linux批量管理工具TeamRemote】

    2,自定义线程池 3,关闭防火墙, selinux 4,自动对时 5,服务裁剪 6,批量建信任 7,修改主机名 8,文件批量上传 9,文件批量下载 10,免键盘登录putty《已集成无需另安装》 11,免键盘登录winscp《已集成无需另...

    TR1.1.18.409.rar

    2,自定义线程池 3,关闭防火墙, selinux 4,自动对时 5,服务裁剪 6,批量建信任 7,修改主机名 8,文件批量上传 9,文件批量下载 10,免键盘登录putty《已集成无需另安装》 11,免键盘登录winscp《已集成无需另...

    自定义简单版ImageLoader实现三级缓存

    自定义简单版ImageLoader 实现三级缓存,主要用到了 LruCache 以及 DiskLruCache 和线程池

    jbpm-executor:用于调度 BPM 请求的 Executor 组件

    jbpm-执行器用于调度 BPM 请求的 Executor 组件可用的功能。 线程池。 重试机制失败回退要运行简单的示例/演示,请移至 src/test/java 并执行 NoCDIExecutorTest

    C++ 线程池示例,VS2015编译通过

    一个简单的线程池示例,可以自定义线程数量和执行任务,代码简洁可扩展性强。在使用上也很方便。下面是一个简单的调用 int main() { xcyk::ThreadPool threadPool("xcyk"); SYSTEM_INFO SystemInfo; ...

    颠覆你对线程池的认知,多参带返回值,传自定义传任意类型-易语言

    使用简单到你不敢相信。传自定义类型功能。传任意参功能。 re = 线程池1.创建 (任务_单参, 回调函数, 待机数, 最大数) '线程工作完。返回结果到回调函数线程池 工作线程返回值将返回到回调函数里面。可用来判断线程...

    linux C++ 实现线程池(避免线程创建的耗时)

    linux下c++写的线程池,可以了解pthread_cond_timewait和pthread_detach的用法,自定义最大使用的线程数量,线程退出线程池的超时时间,任务优先级处理。

    my-executor-service.zip

    本人自定义纯手写的线程池代码功能,代码注释简单明了,开箱即用,即不用做任务修改即可run起来。希望可以帮助大家!

    积分管理系统java源码-study:学习

    自定义线程池 Mysql BinLog 原理: 数据库为了主从复制结构和容灾,都会有一份提交日志 (commit log),通过解析这份日志, 理论上说可以获取到每次数据库的数据更新操作。获取到这份日志有两种方式: 在 MySQL server...

    百度地图开发java源码-wtp:WTP-一个可靠的线程池管理系统

    是一个轻量级线程池管理系统,能够集中管理不同应用、不同集群的线程配置,修改配置后能够实时刷新,使用起来,简单易用。 支持JAVA客户端,可在Spring/Spring Boot环境下运行 支持JKD1.8,以及更高版本。 演示 : ...

    基于自定义网络协议 、Reactor 网络模型的轻量RPC框架(源码+项目说明).zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用!...基于 Connect UDP 和自定义网络协议(简单请求响应协议) 、Reactor 网络模型(one loop per thread + 线程池) 的轻量RPC框架(源码+项目说明).zip

    基于 Connect UDP 和自定义网络协议 、Reactor 网络模型 的轻量RPC框架(源码+项目说明).zip

    1、该资源内项目代码经过严格调试,下载即用确保可以运行!...基于 Connect UDP 和自定义网络协议(简单请求响应协议) 、Reactor 网络模型(one loop per thread + 线程池) 的轻量RPC框架(源码+项目说明).zip

    一个开源的Java基础工具包

    此工具我不再更新,里面... 若想自定义线程池大小或独立控制,可调用newExecutor()实例化一个线程池 excAsync()执行一个异步方法 3、com.baijob.commonTools.thread.SyncQueue 阻塞队列,简化了JDK的BlockingQueue

    简单Web服务器(Java实现)

    支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件和简单的日志记录。要支持PHP的动态脚本的话,需要自行下载PHP的文件到php目录下,并且更改设置,...

    Android 线程之自定义带消息循环Looper的实例

    Android 线程之自定义带消息循环Looper的实例 Android系统的UI线程是一种带消息循环(Looper)机制的线程,同时Android也提供了封装有消息循环(Looper)的HandlerThread类,这种线程,可以绑定Handler()对象,并...

    springboot学习

    chapter4-1-3:使用@Async实现异步调用:自定义线程池 chapter4-1-4:使用@Async实现异步调用:资源优雅关闭 chapter4-1-5:使用@Async实现异步调用:使用Future以及定义超时 日志管理 chapter4-2-1:默认日志的配置...

Global site tag (gtag.js) - Google Analytics