ThreadNext.java 1.76 KB
Newer Older
yanzg's avatar
yanzg committed
1 2 3 4 5 6 7
package com.yanzuoguang.util.thread;

import com.yanzuoguang.util.helper.StringHelper;
import com.yanzuoguang.util.log.Log;

/**
 * 线程执行类
yanzg's avatar
yanzg committed
8
 *
yanzg's avatar
yanzg committed
9
 * @author 颜佐光
yanzg's avatar
yanzg committed
10 11 12
 */
public class ThreadNext {

yanzg's avatar
yanzg committed
13 14 15
    /**
     * 下一个处理结接口
     */
yanzg's avatar
yanzg committed
16 17 18 19 20
    public interface Next {
        /**
         * 执行下一个函数,出现异常会继续执行
         *
         * @return 是否继续执行
yanzg's avatar
yanzg committed
21
         * @throws Exception 异常信息
yanzg's avatar
yanzg committed
22 23 24 25 26 27 28 29 30 31 32
         */
        boolean next() throws Exception;

        /**
         * 沉睡时间
         *
         * @return
         */
        int getNextTime();
    }

yanzg's avatar
yanzg committed
33
    public static void start(final Next next, String error) {
yanzg's avatar
yanzg committed
34 35 36 37 38 39
        if (next == null) {
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
yanzg's avatar
yanzg committed
40
                runNext(next);
yanzg's avatar
yanzg committed
41 42 43
            }
        }).start();
    }
yanzg's avatar
yanzg committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

    private static void runNext(Next next) {
        boolean isExecute = true;
        Exception frontEx = null;
        while (isExecute) {
            try {
                isExecute = next.next();
            } catch (Exception ex) {
                boolean isHistoryEx = frontEx == null || !(frontEx.getClass() == ex.getClass() &&
                        StringHelper.compare(frontEx.getMessage(), ex.getMessage()));
                if (isHistoryEx) {
                    Log.error(ThreadNext.class, ex);
                }
                frontEx = ex;
            }
            if (isExecute) {
                try {
                    int max = Math.max(next.getNextTime(), 100);
                    Thread.sleep(max);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                break;
            }
        }
    }
yanzg's avatar
yanzg committed
71
}