1. 程式人生 > 其它 >《資料安全實踐指南》- 資料來源鑑別及記錄

《資料安全實踐指南》- 資料來源鑑別及記錄

package com.sunwayland.mes.report.util;

import com.sunwayland.mes.report.config.CustomThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.*;

/**
*
* 執行緒池工具,用來建立執行緒池,並提供將任務新增到執行緒池的方法<br>
*
* 固定執行緒數為50,超過時放入無界佇列中等待.<br>
*
* 使用方法: 假如要把<br>
* registService.saveRegist(prpLregist); <br>
* 放到單獨執行緒執行,則:
*
* <pre>
* ThreadPoolUtils.exec(new Runnable() {
* public void run() {
* registService.saveRegist(prpLregist);
* }
* });
* </pre>
*
* 執行緒並行提交併最後要獲取執行緒的執行結果,使用方法:
* <pre>
* Future future = ThreadPoolUtils.exec(new TaskTest());
*
* public class TaskTest implements Callable<String> {
* public String call() {
* return "Hello World!";
* }
* }
* future.get()獲取執行緒執行返回的結果
* </pre>
*
* 注意:新執行緒與啟動執行緒相互獨立,hibernate session不共享、事務不傳遞,所以不支援傳入可能懶載入的物件。
*/
public class ThreadPoolUtils {
private final static Logger logger = LoggerFactory.getLogger(ThreadPoolUtils.class);
/**
* 核心執行緒池大小
*/
public static final int CORE_POOL_SIZE = 100;
/**
* 最大執行緒池大小
*/
public static final int MAX_POOL_SIZE = 200;
/**
* 阻塞任務佇列大小
*/
public static final int QUEUE_CAPACITY = 2048;
/**
* 空閒執行緒存活時間
*/
public static final Long KEEP_ALIVE_TIME = 30L;

private static final ThreadPoolExecutor exec = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY),
new CustomThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());

/**
* 禁止例項化
*/
private ThreadPoolUtils() {

}

/**
* 提交任務
*/
public static void exec(Runnable task) {
ThreadPoolUtils.catThreadPoolInfo();
exec.submit(task);
}

/**
* 並行提交任務並獲取執行緒執行後返回的結果
* @param: task
* @return:
*/
public static Future<?> execCallable(Callable<?> task) {
ThreadPoolUtils.catThreadPoolInfo();
return exec.submit(task);
}
/**
* 並行提交任務並獲取執行緒執行後返回的結果
* @param: task
* @return:
*/
public static void catThreadPoolInfo() {
logger.info("當前排隊執行緒數:{}",exec.getQueue().size());
logger.info("當前活動執行緒數:{}",exec.getActiveCount());
logger.info("執行完成執行緒數:{}",exec.getCompletedTaskCount());
logger.info("匯流排程數:{}",exec.getTaskCount());
}
}