TaskTimeout.java 1.98 KB
package com.gimi.common.cinema.utils;


import android.text.TextUtils;

import java.io.File;
import java.util.concurrent.*;

/**
 * 启动一个任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则中止任务。
 *
 * @author Chen Feng
 */
public class TaskTimeout {

    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        execTask(exec, 15, ""); // 任务成功结束后等待计算结果,不需要等到15秒
        execTask(exec, 5, ""); // 只等待5秒,任务还没结束,所以将任务中止
        exec.shutdown();
    }

    public static boolean execTask(ExecutorService exec, int timeout, String path) {
        ChargeTask task = new ChargeTask(path);
        Future<Boolean> future = exec.submit(task);
        Boolean taskResult = null;
//        String failReason = null;
        try {
            // 等待计算结果,最长等待timeout hao秒,timeout秒后中止任务
            taskResult = future.get(timeout, TimeUnit.MILLISECONDS);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
//            failReason = "主线程在等待计算结果时被中断";
        } catch (TimeoutException e) {
            e.printStackTrace();
//            failReason = "主线程等待计算结果超时,因此中断任务线程!";
            exec.shutdownNow();
        }
        if (taskResult == null) {
            return false;
        }
        return taskResult;
    }

    public static boolean execTask(){
        return false;
    }

    //do what you want to do
    class PingTask implements Callable<Boolean> {
        String path;

        public PingTask(String path) {
            this.path = path;
        }

        @Override
        public Boolean call() throws Exception {
            if (TextUtils.isEmpty(path)) {
                return false;
            }
            return new File(path).exists();
        }
    }
}