zoukankan      html  css  js  c++  java
  • java多线程线程管理

    话不多说,上代码

    package com.net.web.core.task;
    
    import com.net.web.core.task.job.Hook;
    import com.net.web.core.task.job.JobThread;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    
    /**
     * Created by Administrator on 2017-11-03.
     */
    public class ThreadManager<E extends JobThread> {
    
        // 最大线程数
        private int maxThread = 0;
    
        // 线程队列
        List<JobThread> jobs = new ArrayList<JobThread>();
    
        // 线程池
        private ScheduledExecutorService executor;
    
        public ThreadManager(){
        }
    
        /**
         * 实例化
         *
         * @param maxThread 最大线程数量
         * @param jobs 要执行的任务队列
         */
        public ThreadManager(int maxThread, List<JobThread> jobs) {
            this.maxThread = maxThread;
            this.jobs = jobs;
        }
    
        /**
         * 执行并等待执行完毕
         */
        public void waitStart() {
            waitStart(null);
        }
    
        /**
         * 执行并等待执行完毕,有回调
         */
        public void waitStart(Hook hook) {
            startThread(hook);
    
            // 结束
            executor.shutdown();
    
            // 是否结束
            while (!executor.isTerminated()) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
            }
    
            // 调用全部结束
            if (hook != null) hook.allEnd();
        }
    
        /**
         * 执行,但是不等待执行完毕
         */
        public void start(final Hook hook) {
            // 开启线程
            startThread(hook);
    
            new Thread() {
                @Override
                public void run() {
                    // 结束
                    executor.shutdown();
    
                    // 是否结束
                    while (!executor.isTerminated()) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                        }
                    }
    
                    // 调用全部结束
                    if (hook != null) hook.allEnd();
                }
            }.start();
        }
    
        /**
         * 初始化
         */
        private void startThread(Hook hook) {
            // 没有线程
            if (maxThread == 0) {
                throw new NullPointerException("MaxThread is null.");
            }
    
            // 线程池初始化
            executor = Executors.newScheduledThreadPool(maxThread);
    
            // 最大数量
            int allNum = jobs.size();
            if (hook != null) hook.setAllNum(allNum);
    
            // 线程队列
            for (int i = 0; i < allNum; i++) {
                // 创建线程
                JobThread jobThread = jobs.get(i);
                jobThread.setHook(hook);
                jobThread.setNum(i+1);
    
                // 执行
                executor.execute(jobThread);
            }
        }
    
        public int getMaxThread() {
            return maxThread;
        }
    
        public void setMaxThread(int maxThread) {
            this.maxThread = maxThread;
        }
    
        public List<JobThread> getJobs() {
            return jobs;
        }
    
        public void setJobs(List<JobThread> jobs) {
            this.jobs = jobs;
        }
    }

    钩子类,方便回馈

    package com.net.web.core.task.job;
    
    /**
     * 进度管理,钩子
     *
     * Created by Administrator on 2017-11-03.
     */
    public class Hook{
        // 所有数量
        private int allNum;
    
        /**
         * 一个进程开始运行的时候
         * @param index
         */
        public void start(int index){};
    
        /**
         * 一个进程结束的时候
         *
         * @param index
         */
        public void end(int index){};
    
        /**
         * 一个进程异常的时候
         *
         * @param index
         */
        public void error(int index){};
    
        /**
         * 所有进程结束的时候
         *
         */
        public void allEnd(){};
    
        public int getAllNum() {
            return allNum;
        }
    
        public void setAllNum(int allNum) {
            this.allNum = allNum;
        }
    }

    线程类

    package com.net.web.core.task.job;
    
    /**
     * Created by Administrator on 2017-11-03.
     */
    public abstract class JobThread implements Runnable {
    
        // 线程编号
        protected int num;
    
        // 钩子
        protected Hook hook;
    
        @Override
        public void run(){
            try {
                // 开始钩子
                if(hook != null) hook.start(this.num);
    
                // 定时任务
                renTask();
    
                // 结束钩子
                if(hook != null) hook.end(this.num);
            }catch (Throwable e){
                if(hook != null) hook.error(this.num);
            }
        }
    
        public abstract void renTask() throws Throwable;
    
        public int getNum() {
            return num;
        }
    
        public void setNum(int num) {
            this.num = num;
        }
    
        public Hook getHook() {
            return hook;
        }
    
        public void setHook(Hook hook) {
            this.hook = hook;
        }
    }
  • 相关阅读:
    Rebots协议是什么?
    Requests库入门
    jieba库的使用及实例
    第六周 python组合数据类型
    python 有基础入门程序
    字符与字符串操作归纳[持续更新]
    C++调用bat并实现传值
    Python如何运行程序
    Execl数据上传到数据库
    xml 文件操作
  • 原文地址:https://www.cnblogs.com/lckblog/p/7845283.html
Copyright © 2011-2022 走看看