java如何自定义一个线程池

java线程池的一些简单功能,后续会更新,代码不多,很好理解

package com.rbac.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

/**
 * 自定义线程池
 *
 * @author xl,lang
 *
 */
public class MyExecutorService {
    // 初始化线程
    protected List<InitThread> initThreads;

    // 执行任务列表
    protected BlockingQueue<Runnable> taskQueues;

    // 线程执行状态
    protected volatile boolean threadState = true;

    /*
     * // 当前线程的活跃数 public AtomicInteger activeCount; public Lock lock=new
     * ReentrantLock(); // 最小活跃数 public int threadMinSize = 0; // 最大线程数 public
     * int threadMaxSize = 0; // 初始话线程数 public int threadInitSize = 0;
     */

    /**
     * 线程初始化方法
     *
     * @param threadMaxSize
     * @param threadInitSize
     * @param taskQueueSize
     */
    /*
     * public MyExecutorService(int threadMaxSize, int threadMinSize, int
     * threadInitSize, int taskQueueSize) { this.taskQueues = new
     * LinkedBlockingDeque<Runnable>(taskQueueSize); if (threadInitSize > 0 &&
     * threadInitSize < threadMaxSize) { this.initThreads = new ArrayList<>();
     * for (int i = 0; i < threadInitSize; i++) { InitThread init = new
     * InitThread(); init.start(); initThreads.add(init); }
     *
     * }
     *
     * }
     */

    /**
     * 线程初始化方法
     *
     * @param threadMaxSize
     * @param threadInitSize
     * @param taskQueueSize
     */
    public MyExecutorService(int threadInitSize, int taskQueueSize) {
        this.taskQueues = new LinkedBlockingDeque<Runnable>(taskQueueSize);
        if (threadInitSize > 0) {
            this.initThreads = new ArrayList<>();
            for (int i = 0; i < threadInitSize; i++) {
                InitThread init = new InitThread();
                init.start();
                initThreads.add(init);
            }

        }

    }

    // 添加任务
    public boolean exeute(Runnable task) throws InterruptedException {

        return this.taskQueues.offer(task, 60, TimeUnit.SECONDS);
    }

    /**
     * 初始化线程
     *
     * @author xl,lang
     *
     */
    class InitThread extends Thread {

        @Override
        public void run() {

            while (threadState || taskQueues.size() > 0) {
                Runnable runable = taskQueues.poll();
                if (null != runable) {
                    runable.run();
                }

            }

        }

    }

    // 关闭线程池
    public void shutdown() {
        this.threadState = false;
    }

    public static void main(String[] args) {

        MyExecutorService es = new MyExecutorService(2, 5);
        for (int i = 0; i < 100; i++) {
            final int a = i;
            try {
                es.exeute(new Runnable() {

                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + "执行" + a);

                    }
                });
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        es.shutdown();

    }
}

原文地址:https://www.cnblogs.com/langjunnan/p/12641441.html

时间: 2024-10-16 08:43:26

java如何自定义一个线程池的相关文章

java所提供的线程池有几种之线程池总结

今天给大家带来一个关于java线程池的资料,主要是因为在早些时候去面试的时候就被问到了线程池的问题,回答的不尽人意,今天突然有人问我一个同样的问题,我觉的我还是总结一下,看起来也方便. Java提供的几种线程池线程池,顾名思义,放线程的池子嘛,这个池子可以存放多少线程取决于你自己采用什么样的线程池,你的硬件资源,以及并发线程的数量.JDK提供了下面的四种线程池: 固定线程数的线程池# 最简单的 在Java中创建一个线程池,这很简单,只需要两行代码. CopyExecutorService exe

二 Java利用等待/通知机制实现一个线程池

接着上一篇博客的 一Java线程的等待/通知模型 ,没有看过的建议先看一下.下面我们用等待通知机制来实现一个线程池 线程的任务就以打印一行文本来模拟耗时的任务.主要代码如下: 1  定义一个任务的接口. 1 /* 2 * 任务的接口 3 */ 4 public interface Task { 5 void doSomething(); 6 } 2  实现一个具体的任务. 1 /* 2 * 具体的任务 3 */ 4 public class PrintTask implements Task{

死磕 java线程系列之自己动手写一个线程池

欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写的线程池如何测试? 简介 线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文彤哥将手把手带你写一个可用的线程池. 属性分析 线程池,顾名思义它首先是一个"池",这个池里面放的是线程,线程是用来执行任务的. 首先,线程池中的线程应该是有类别的,有的是核心线程,有

死磕 java线程系列之自己动手写一个线程池(续)

(手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的任务的,那么,我们自己能否实现呢?必须可以,今天我们就一起来实现带返回值任务的线程池. 前情回顾 首先,让我们先回顾一下上一章写的线程池: (1)它包含四个要素:核心线程数.最大线程数.任务队列.拒绝策略: (2)它具有执行无返回值任务的能力: (3)它无法处理有返回值的任务: (4)它无法处理任务

Java多线程-新特性-线程池

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要. 有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程.目前有关这方面的资料和书籍都少之又少,大部分介绍线程方面书籍还停留在java5之前的知识层面上. 在Java5之

Java并发基础(六) - 线程池

Java并发基础(六) - 线程池 1. 概述 这里讲一下Java并发编程的线程池的原理及其实现 2. 线程池的基本用法 2.1 线程池的处理流程图 该图来自<Java并发编程的艺术>: 从图中我们可以看出当一个新任务到线程池时,线程池的处理流程如下: 线程池首先判断线程池里面线程数是否达到核心线程数.如果不是则直接创建新线程作为核心线程来执行该任务(该线程作为核心线程不会由于任务的完成而销毁),否则进入下一流程. 判断阻塞队列是否已经满了.如果没满则将该任务放入阻塞队列中,等待核心线程处理,

[转]Java Executor框架和线程池笔记

Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭,可以简化并发编程的操作.因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一

Java 并发包之线程池综述

■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM资源是有限的,线程不能无限创建! 从笔者开发经验来看,线程池应该是并发包中使用频率和运用场景最多的并发框架,几乎所有并发/异步执行任务的需求都需要用到线程池,线程复用,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务.合理的使用线程池可以带来如下三个好处:       1.降低资源消耗:通过重用已创建的线程来

Java多线程系列--“JUC线程池”03之 线程池原理(二)

线程池示例 在分析线程池之前,先看一个简单的线程池示例. import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; public class ThreadPoolDemo1 { public static void main(String[] args) { // 创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThre