简单实现java线程池

使用多线程以及线程池的意义无需多说,要想掌握线程池,最好的方法还是自己手动去实现。

一、实现思路

                      (网络盗图)

总的来说,所有的任务在BlockingQueue中进行等待,由Worker进行具体的操作,Worker才是真正的工作线程。

二、代码

1、线程池类

package com.ty.thread;import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author Taoyong
 * @date 2018年5月17日
 * 天下没有难敲的代码!
 */
public class ThreadPoolExecutor {

    //维护线程的list
    private Set<Thread> threadList = new HashSet<Thread>();

    /*
     * 阻塞队列是线程安全的,主要使用在生产/消费者的场景
     */
    private BlockingQueue<Task> blockingQueue;

    //线程池的工作线程数
    private int poolSize = 0;

    //线程池的核心容量
    private int coreSize = 0;

    private boolean shutDown = false;

    public ThreadPoolExecutor(int size) {
        this.poolSize = size;
        blockingQueue = new LinkedBlockingQueue<>(poolSize);
    }

    public void execute(Task task) throws InterruptedException {
        if(shutDown == true) {
            return;
        }

        if(coreSize < poolSize) {
            blockingQueue.offer(task);
            produceWorker(task);
        }else {
            blockingQueue.put(task);
        }
    }

    private void produceWorker(Task task) throws InterruptedException {
        if(task == null) {
            throw new NullPointerException("非法参数:传入的task对象为空!");
        }

        if(shutDown == true) {
            return;
        }

        Thread thread = new Thread(new Worker());
        threadList.add(thread);
        coreSize++;
        thread.start();
    }
   public void shutDown() {
        if(threadList == null || threadList.size() == 0) {
            return;
        }
        shutDown = true;
        for(Thread thread: threadList) {
            System.out.println(thread.getName() + " interrupt");
            thread.interrupt();
        }
    }

    /*
     * 此内部类是实际上的工作线 worker是实现了Runnable接口的实际工作线程,通过while(true)循环从BlockingQueue中取任务执行。
     *
     */
    class Worker implements Runnable {

        @Override
        public void run() {
            while(true && shutDown == false) {
                try {
                    blockingQueue.take().doJob();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

2、Task类(需要被线程处理的任务类)

package com.ty.thread;

/**
 * @author Taoyong
 * @date 2018年5月17日
 * 天下没有难敲的代码!
 */
public class Task {

    //通过taskId对任务进行标识
    private int taskId;

    public Task(int taskId) {
        this.taskId = taskId;
    }

    public void doJob() {
        System.out.println("线程" + Thread.currentThread().getName() + "正在处理任务!");
    }

    public int getId() {
        return taskId;
    }
}

3、测试类

package com.ty.thread;

/**
 * @author Taoyong
 * @date 2018年5月17日
 * 天下没有难敲的代码!
 */
public class ThreadPoolExecutorTest {

    public static void main(String[] args) throws InterruptedException {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3);
        for(int i = 0; i < 10; i++) {
            Task task = new Task(i);
            threadPoolExecutor.execute(task);
        }        

        threadPoolExecutor.shutDown();
    }
}

4、运行结果

线程Thread-0正在处理任务!
线程Thread-2正在处理任务!
线程Thread-0正在处理任务!
线程Thread-1正在处理任务!
线程Thread-2正在处理任务!
线程Thread-2正在处理任务!
线程Thread-1正在处理任务!
线程Thread-2正在处理任务!
线程Thread-0正在处理任务!
Thread-1 interrupt
Thread-0 interrupt
Thread-2 interrupt

当第十个任务待处理时,整个线程池已经被shutDown,整个流程结束。

原文地址:https://www.cnblogs.com/alimayun/p/9054027.html

时间: 2024-10-16 16:42:19

简单实现java线程池的相关文章

Java线程池:ExecutorService,Executors

简单的Java线程池可以从Executors.newFixedThreadPool( int n)获得.此方法返回一个线程容量为n的线程池.然后ExecutorService的execute执行之. 现给出一个示例. package zhangphil.executorservice; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ZhangPhil

这么说吧,java线程池的实现原理其实很简单

好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线程的可管理性. Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. demo 1.Executors.newFixedThreadPool(10)初始化一个包含10个线程的线程池ex

Java线程池使用说明

Java线程池使用说明 一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少

Java 线程池的原理与实现

最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用

JAVA线程池中队列与池大小的关系

JAVA线程中对于线程池(ThreadPoolExecutor)中队列,池大小,核心线程的关系写出自己的理解: 1:核心线程:简单来讲就是线程池中能否允许同时并发运行的线程的数量 2:线程池大小:线程池中最多能够容纳的线程的数量. 3:队列:对提交过来的任务的处理模式. 对于线程池与队列的交互有个原则: 如果队列发过来的任务,发现线程池中正在运行的线程的数量小于核心线程,则立即创建新的线程,无需进入队列等待.如果正在运行的线程等于或者大于核心线程,则必须参考提交的任务能否加入队列中去. 1:提交

java线程池分析和应用

比较 在前面的一些文章里,我们已经讨论了手工创建和管理线程.在实际应用中我们有的时候也会经常听到线程池这个概念.在这里,我们可以先针对手工创建管理线程和通过线程池来管理做一个比较.通常,我们如果手工创建线程,需要定义线程执行对象,它实现的接口.然后再创建一个线程对象,将我们定义好的对象执行部分装载到线程中.对于线程的创建.结束和结果的获取都需要我们来考虑.如果我们需要用到很多的线程时,对线程的管理就会变得比较困难.我们手工定义线程的方式在时间和空间效率方面会存在着一些不足.比如说我们定义好的线程

Java线程池的基础应用

了解:原子性操作类的基础用法 在java5以后,增加很多线程的内容,成为线程得并发库. 在java.util.concurrent包及子包的API帮助文档,上面有对并发库涉及内容 在java.util.concurrent.atomic包,有对基本数据,对数组中的基本数据,类中的基本数据等的操作 AtomicIneger类,可以解决多线程访问整数的问题 AtomicBoolean..... AtomicArray...操作数组的基本数据 AtomicIntegerFieldUodater<T>

Java线程池使用和分析(二) - execute()原理

相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”,即向线程池中提交任务,在未来某个时刻执行,提交的任务必须实现Runnable接口,该提交方式不能获取返回值.下面是对execute()方法内部原理的分析,分析前先简单介绍线程池有哪些状态,在一系列执行过程中涉及线程池状态相关的判断

JAVA线程池应用的DEMO

在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了.在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不多说了. Java线程池说起来也简单,简单说下继承关系: ThreadPoolExecutor extends AbstractExecutorService implements ExecutorService extends Executor 还有一个支持延时执行线程和可以重复执行线程的实现类: Sc