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;
    }
}
相关推荐
@大迁世界2 小时前
AI还替不了的JS能力
开发语言·前端·javascript·人工智能·ecmascript
放逐者-保持本心,方可放逐2 小时前
Go + WebAssembly 构建树木数据统计分析系统
开发语言·golang·wasm·javascipt
●VON2 小时前
鸿蒙NEXT ArkUI进阶:用CustomBuilder打造高定制化品牌页签栏
java·华为·harmonyos·鸿蒙·新特性
夕除2 小时前
spring boot 16
java·spring boot·后端
ftpeak2 小时前
深入浅出 LoongSuite Python Agent:让你的 AI 应用「透明化」(下篇)
开发语言·人工智能·ai·ai编程·ai开发
努力成为AK大王2 小时前
Spring Bean 作用域与生命周期
java·后端·spring
希望永不加班2 小时前
SpringBoot 消息幂等性设计:防重复消费
java·开发语言·spring boot·后端·spring
l1t2 小时前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程7-8
开发语言·python
我是一颗柠檬2 小时前
【JDK8新特性】CompletableFuture异步编程Day10
java·开发语言·后端·intellij-idea