java项目-流水线线程池

项目效果:

实现生产者生成任务,线程池A接受并且处理任务,接着传递给B,B处理过后给C,最终实现流水线处理效果

项目构成:一个主线程类Main,三个任务类TaskABC,一个任务处理底层逻辑类Task

代码实现:

1.Main类

任务处理线程+监听线程

java 复制代码
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author jinhuang
 * @date 2026/5/23  15:37
 * @description ${DESCRIPTION}
 */// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
    public static void main(String[] args) {
        // 固定任务量
        ArrayBlockingQueue<Runnable> queueA = new ArrayBlockingQueue<>(20);
        ArrayBlockingQueue<Runnable> queueB = new ArrayBlockingQueue<>(20);
        ArrayBlockingQueue<Runnable> queueC = new ArrayBlockingQueue<>(20);
        ArrayList<Task> taskDoneList = new ArrayList<>();
        //创建三个线程池
        Executor executorA=new ThreadPoolExecutor(5,10,1000, TimeUnit.MILLISECONDS,queueA);
        Executor executorB=new ThreadPoolExecutor(5,10,1000, TimeUnit.MILLISECONDS,queueB);
        Executor executorC=new ThreadPoolExecutor(5,10,1000, TimeUnit.MILLISECONDS,queueC);


        //生产者实时生成任务处理
        new Thread(()->{
            int count=0;
            while (true){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                Task task=new Task();
                executorA.execute(new TaskA(executorB,executorC,taskDoneList,task));
                count++;
                System.out.println("生产者"+count);
            }
        }).start();

        //监控线程
        new Thread(()->{
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("队列A大小:" + queueA.size() + " 队列B大小:" +
                        queueB.size() + " 队列C大小:" + queueC.size());
                int count = 0;
                for (int i = 0; i < taskDoneList.size(); i++) {
                    if (taskDoneList.get(i).num == 40000) {
                        count++;
                    }
                }
                System.out.println("已完成的任务数量:" + taskDoneList.size() + "正确的数量"+ count);
            }}).start();
        }
            }

2.TaskABC

核心在于任务在线程池BC中的传递,通过execute方法实现

java 复制代码
import java.util.ArrayList;
import java.util.concurrent.Executor;

/**
 * @author jinhuang
 * @date 2026/5/23  15:39
 * @description
 */
public class TaskA implements Runnable{
    Executor executorB;
    Executor executorC;
    ArrayList<Task> taskDoneList;
    Task task;
    //初始化TaskA
    public TaskA(Executor B,Executor C,ArrayList<Task> taskDoneList,Task task) {
        this.executorB = B;
        this.executorC = C;
        this.taskDoneList = taskDoneList;
        this.task = task;
    }

    @Override
    public void run() {
        task.taskA();
        // 将执行完的任务提交给线程池B
        executorB.execute(new TaskB(task, executorC, taskDoneList));
    }
}
class TaskB implements Runnable{
    Task task;
    Executor executorC;
    ArrayList<Task> taskDoneList;
    public TaskB(Task task, Executor executorC, ArrayList<Task> taskDoneList) {
        this.task = task;
        this.executorC = executorC;
        this.taskDoneList = taskDoneList;
    }
    @Override
    public void run() {
        task.taskB();
// 将执行完的任务提交给线程池C
        executorC.execute(new TaskC(task, taskDoneList));
    }
}

class TaskC implements Runnable{
    Task task;
    ArrayList<Task> taskDoneList;
    public TaskC(Task task, ArrayList<Task> taskDoneList) {
        this.task = task;
        this.taskDoneList = taskDoneList;
    }
    @Override
    public void run() {
        task.taskC();
        taskDoneList.add(task);
    }
}

3.Task类

这个类中定义了三个任务流水线的工序

java 复制代码
public class Task {
    int num;
    public void taskA()  {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        num+=20;
    }

    public void taskB(){
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        num*=10;
    }

    public void taskC(){
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        num*=num;
    }
}
相关推荐
万年咸鱼4 小时前
Java BufferedOutputStream 详解:原理、用法与性能优化
java·开发语言·性能优化
万年咸鱼4 小时前
Java BufferedInputStream 详解:原理、用法与实战
java·开发语言·python
weixin199701080164 小时前
[特殊字符]《二手ERP × 闲鱼消息驱动架构:正向+逆向交易消息如何驱动WMS出库与回传》(附Python源码)
开发语言·python·架构
galaxy_strive5 小时前
Qt C++插件化编写项目(1)
开发语言·c++·qt
~木雨5 小时前
Java 线程池七问七答:参数、执行流程、拒绝策略到 ThreadLocal 内存泄漏,面试必背
java·面试·线程池·threadlocal·threadpool·executor
见叶之秋5 小时前
【C++】C++ 核心进阶(一):泛型编程基石 —— 模板初阶与 STL 体系开篇
开发语言·c++
Escalating_xu5 小时前
【Makefile 进阶】从自动发现源文件、模式规则到目录分离与多模块递归构建
linux·开发语言
艾莉丝努力练剑5 小时前
【AI大模型接入SDK】Gemini模型接入知识体系
java·开发语言·网络·人工智能·网络协议·学习·http
云运维笔记5 小时前
Zabbix 分布式监控搭建实战:基于 Proxy 实现 MySQL、Java、Nginx 监控
java·mysql·zabbix
传奇开心果编程5 小时前
【Rust入门知识点学与练】第13课:枚举 Enum
开发语言·学习·rust