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;
    }
}
相关推荐
考虑考虑11 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯11 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路15 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还18 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev20 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序1 天前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏1 天前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev1 天前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还2 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩2 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构