//package com.muyu.parsing.manager;
//
///**
// * @Author: 胡杨
// * @Name: TaskManager
// * @Description: 任务管理器
// * @CreatedDate: 2024/9/4 下午7:44
// * @FilePath: com.muyu.quest.manager
// */
//
//
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.Collections;
//import java.util.LinkedList;
//import java.util.List;
//
//import static java.lang.Thread.sleep;
//
///**
// * 基础线程配置
// */
//@Slf4j
//public final class TaskManagers {
//    // 线程池中默认线程的个数为5
//    private static int workerNum = 8;
//    // 工作线程
////    private final WorkThread[] workThrads;
//    // 未处理的任务
//    private static volatile int finishedTask = 0;
////
////    // 任务队列
////    private final List<Runnable> taskQueue = new LinkedList<Runnable>();
////    private static TaskManager taskManager;
////
////    private long startTime;
////    private long endTime;
////
////    // 创建具有默认线程个数的线程池
////    private TaskManager() {
////        this(8);
////    }
////
////    // 创建线程池,workerNum为线程池中工作线程的个数
////    private TaskManager(int workerNum) {
////        taskManager.workerNum = workerNum;
////        workThrads = new WorkThread[workerNum];
////        for (int i = 0; i < workerNum; i++) {
////            workThrads[i] = new WorkThread();
////            workThrads[i].start();// 开启线程池中的线程
////        }
////        startTime = System.currentTimeMillis();
////    }
////
////    // 单态模式，获得一个默认线程个数的线程池
////    public static TaskManager getTaskManager() {
////        return getTaskManager(TaskManager.workerNum);
////    }
////
////    // 单态模式，获得一个指定线程个数的线程池,workerNum(>0)为线程池中工作线程的个数
////    // workerNum<=0创建默认的工作线程个数
////    public static TaskManager getTaskManager(int workerNum1) {
////        if (workerNum1 <= 0) {
////            workerNum1 = TaskManager.workerNum;
////        }
////        if (taskManager == null) {
////            taskManager = new TaskManager(workerNum1);
////        }
////        return taskManager;
////    }
////
////    // 把任务加入任务队列
////    public void execute(List<Runnable> task) {
////        execute(task.toArray(new Runnable[0]));
////    }
////
////    // 把任务加入任务队列
////    public void execute(Runnable... task) {
////        synchronized (taskQueue) {
////            Collections.addAll(taskQueue, task);
////            taskQueue.notify();
////        }
////    }
////
////
////    // 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程，否则等待任务完成才销毁
////    public void destroy() {
////        while (!getIsRunning()) {// 如果还有任务没执行完成，就先睡会吧
////            try {
////                sleep(500);
////            } catch (InterruptedException e) {
////                e.printStackTrace();
////            }
////        }
////        // 工作线程停止工作，且置为null
////        for (int i = 0; i < workerNum; i++) {
////            workThrads[i].stopWorker();
////            workThrads[i] = null;
////        }
////        taskManager = null;
////        taskQueue.clear();// 清空任务队列
////    }
////
////    // 任务完成后,统计线程池的运行情况
////    public void closed() {
////        while (!getIsRunning()) {// 如果还有任务没执行完成，就先睡会吧
////            try {
////                sleep(500);
////            } catch (InterruptedException e) {
////                e.printStackTrace();
////            }
////        }
////        log.info("任务完成,线程状态: {}", this.toString());
////        taskManager = null;
////    }
////
////    // 返回工作线程的个数
////    public int getWorkThreadNumber() {
////        return workerNum;
////    }
////
////    // 返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数，可能该任务并没有实际执行完成
////    public int getFinishedTasknumber() {
////        return finishedTask;
////    }
////
////    // 返回任务队列的长度，即还没处理的任务个数
////    public int getWaitTasknumber() {
////        return taskQueue.size();
////    }
////
////    /**
////     * 返回线程池当前状态
////     *
////     * @return 如果还在工作返回false，否则返回true
////     */
////    public Boolean getIsRunning() {
////        return taskQueue.isEmpty() || (taskManager.getWaitTasknumber() == 0 && taskManager.getWorkThreadNumber() == 0);
////    }
////
////    // 覆盖toString方法，返回线程池信息：工作线程个数和已完成任务个数
////    @Override
////    public String toString() {
////        endTime = System.currentTimeMillis();
////        return "工作任务数:" + workerNum + ",已完成任务数:"
////                + finishedTask + ",等待任务数:" + getWaitTasknumber()
////                + "线程池作时长：" + (endTime - startTime) + "ms";
////    }
////
////    /**
////     * 内部类，工作线程
////     */
////    private class WorkThread extends Thread {
////        // 该工作线程是否有效，用于结束该工作线程
////        private boolean isRunning = true;
////
////        /*
////         * 关键所在，如果任务队列不空，则取出任务执行，若任务队列空，则等待
////         */
////        @Override
////        public void run() {
////            Runnable r = null;
////            while (isRunning) {// 若线程无效则自然结束run方法，该线程就没用了
////                synchronized (taskQueue) {
////                    while (isRunning && taskQueue.isEmpty()) {// 队列为空
////                        try {
////                            taskQueue.wait(50);
////                        } catch (InterruptedException e) {
////                            e.printStackTrace();
////                        }
////                    }
////                    if (!taskQueue.isEmpty()) {
////                        r = taskQueue.remove(0);// 取出任务
////                    }
////                }
////                if (r != null) {
////                    r.run();// 执行任务
////                }
////                finishedTask++;
////                r = null;
////            }
////        }
////
////        // 停止工作，让该线程自然执行完run方法，自然结束
////        public void stopWorker() {
////            isRunning = false;
////        }
////    }
//}
