ThreadNext.java 1.9 KB
package com.yanzuoguang.util.thread;

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

/**
 * 线程执行类
 *
 * @author 颜佐光
 */
public class ThreadNext {

    /**
     * 下一个处理结接口
     */
    public interface Next {
        /**
         * 执行下一个函数,出现异常会继续执行
         *
         * @return 是否继续执行
         * @throws Exception 异常信息
         */
        boolean next() throws Exception;

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

    /**
     * 开始执行
     *
     * @param next
     * @param error
     */
    public static void start(final Next next, String error) {
        if (next == null) {
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                runNext(next);
            }
        }).start();
    }

    /**
     * 下一次执行
     *
     * @param next
     */
    private static void runNext(Next next) {
        boolean isPause = true;
        Exception frontEx = null;
        while (isPause) {
            try {
                isPause = 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 (isPause) {
                try {
                    int max = Math.max(next.getNextTime(), 100);
                    Thread.sleep(max);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                break;
            }
        }
    }
}