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;
    }
}
相关推荐
知守观几秒前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
Ai-_Man1 分钟前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
raindayinrain10 分钟前
c++设计模式
开发语言·c++·设计模式
Java成神之路-16 分钟前
Java String 为什么不可变?和 HashMap 到底有什么关系?
java
hiahiahia12318 分钟前
Streaming Model Output
开发语言·前端
paopaokaka_luck19 分钟前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
文丑颜不良啊30 分钟前
LeetCode1401~1420题目解析
java·leetcode
Nuanyt31 分钟前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
文丑颜不良啊39 分钟前
LeetCode1341~1360题目解析
java·leetcode
熊猫钓鱼>_>1 小时前
鸿蒙PC高分屏与键鼠交互适配:DPI缩放、右键菜单一次讲清
开发语言·笔记·华为·ai编程·harmonyos·鸿蒙·鸿蒙心迹