迷你项目练习题5模拟线程池

本文介绍了如何在Java中实现线程池和线程调度。通过ExecuteThread类创建执行线程,并使用ThreadPoolExecutor类进行线程管理和调度。线程池包含多个ExecuteThread实例,当有任务提交时,ThreadPoolExecutor会寻找空闲线程执行任务,确保资源的有效利用。
摘要由CSDN通过智能技术生成

执行线程ExecuteThread类

/**
 * 执行线程
 */
public class ExecuteThread extends Thread {
    //任务运行状态
    boolean runningFlag = false;
    //任务,代表回调
    private Runnable callBack;
    //构造方法
    public void setCallBack(Runnable callBack) {
        this.callBack = callBack;
    }

    public synchronized void setRunningFlag(boolean runningFlag) {
        this.runningFlag = runningFlag;
        if (runningFlag) {
            this.notify();
        }
    }

    //重写run方法
    @Override
    public synchronized void run() {
            while (true) {
                while (!runningFlag) {
                    //非运行状态,也就是没有任务运行的状态
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //有任务则运行任务
                callBack.run();
                //运行完任务设置运行标志为false
                setRunningFlag(false);
            }
        }
    }

线程调度ThreadPoolExecutor类

  • 用来管理线程池,进行线程的调度
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 线程池的调度器
 * 用来管理线程池,进行线程的调度
 */
public class ThreadPoolExecutor {
    //线程池
    List<ExecuteThread> threads;
    //线程池的初始化
    public ThreadPoolExecutor(int n) {
        //同步管理池中的线程
        threads = Collections.synchronizedList(new ArrayList<>());
        for (int i = 0; i < n; i++) {
            //创建线程
            ExecuteThread executeThread = new ExecuteThread();
            //将创建好的线程放入池中
            threads.add(executeThread);
            //启动线程
            executeThread.start();
        }
    }

    //执行任务的方法
    public void execute(Runnable callBack) {
        //到线程池中找空闲的线程
        int i = 0;
        while (true) {
            for (; i < threads.size(); i++) {
                //得到每一个线程
                ExecuteThread executeThread = threads.get(i);
                //判断每一个线程是否是运行的状态(忙状态)
                //如果状态为空闲状态,可以使用它执行任务
                if (!executeThread.runningFlag) {
                    //设置要运行的任务
                    executeThread.setCallBack(callBack);
                    //设置状态为运行状态
                    executeThread.setRunningFlag(true);
                    //退出本次循环
                    break;
                }

            }
            //没有找到空闲的线程
            if (i == threads.size()) {
                //提示没有资源,请稍后再访问
                System.out.println("没有资源,请稍后再访问");
            }
            //找到后退出方法
            else {
                System.out.println("我在停止");
                return;
            }
        }
    }
}

测试类Test

public class PoolTest {
    public static void main(String[] args) {
        //创建有5个线程的线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5);
        //执行任务
        for (int i = 0; i < 5; i++) {
            int finalI = i;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            threadPoolExecutor.execute(() -> System.out.println("任务"+ finalI));
        }
        System.exit(0);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值