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;
        }
    }
  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/lckblog/p/7845283.html
Copyright © 2011-2022 走看看