Java 线程池和CountDownLatch结合返回执行结果

CountDownLatch和线程池结合,返回执行结果
优雅关闭线程池,参考https://www.cnblogs.com/goodA...

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TaskWorkerMain {
    static ThreadPoolExecutor taskExecutor = new ThreadPoolExecutor(20, 50, 0L, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue(100));

    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(3);
        TaskWorker worker1 = new TaskWorker(latch, "1");
        TaskWorker worker2 = new TaskWorker(latch, "2");
        TaskWorker worker3 = new TaskWorker(latch, "3");
        // 利用线程池执行线程
        taskExecutor.execute(worker1);
        taskExecutor.execute(worker2);
        taskExecutor.execute(worker3);
        try {
            latch.await(5000, TimeUnit.MILLISECONDS);// 设置超时时间为5秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (latch.getCount() == 0f) {
                System.out.println("worker1:" + worker1.getResultMsg() + "\nworker2:" + worker2.getResultMsg()
                        + "\nworker3:" + worker3.getResultMsg());
            }
            taskExecutor.shutdown(); // Disable new tasks from being submitted
            // 设定最大重试次数
            try {
                // 等待 60 s
                if (!taskExecutor.awaitTermination(60, TimeUnit.SECONDS)) {
                    // 调用 shutdownNow 取消正在执行的任务
                    taskExecutor.shutdownNow();
                    // 再次等待 60 s,如果还未结束,可以再次尝试,或则直接放弃
                    if (!taskExecutor.awaitTermination(60, TimeUnit.SECONDS))
                        System.err.println("线程池任务未正常执行结束");
                }
            } catch (InterruptedException ie) {
                // 重新调用 shutdownNow
                taskExecutor.shutdownNow();
            }
        }
    }
}

class TaskWorker implements Runnable{

    private CountDownLatch countDownLatch;
    private String requestParam;
    private String resultMsg = "";
    private String resultErrMsg;
    
    public TaskWorker(CountDownLatch countDownLatch, String requestParam) {
        super();
        this.countDownLatch = countDownLatch;
        this.requestParam = requestParam;
    }

    @Override
    public void run() {
        String result = "";
        try {
            //TODO 逻辑代码
            result = doRealLogic(requestParam);
            
            //设置返回值
            setResultMsg(result);
        } catch (Exception e) {
            setResultErrMsg(e.getMessage());
        }finally {
            countDownLatch.countDown();    
        }
    }

    /**
     * 真实逻辑代码
     * @param requestParam
     * @return
     */
    private String doRealLogic(String requestParam) {
        return requestParam;
    }

    public String getResultMsg() {
        return resultMsg;
    }

    public void setResultMsg(String resultMsg) {
        this.resultMsg = resultMsg;
    }

    public String getResultErrMsg() {
        return resultErrMsg;
    }

    public void setResultErrMsg(String resultErrMsg) {
        this.resultErrMsg = resultErrMsg;
    }    
}

你可能感兴趣的:(多线程,线程池,java)