3 import java.util.concurrent.Callable;
4 import java.util.concurrent.Executors;
5 import java.util.concurrent.Future;
6 import java.util.concurrent.ThreadPoolExecutor;
7
8 import lombok.extern.slf4j.Slf4j;
9
10 /**
11 * task线程池的工具类(单例)13 *
14 * 2020年02月26日
15 * @param
16 */
17 @Slf4j
18 public class ThreadPoolManager {
19
21
22 private static final int THREAD_POOL_SIZE = 8;
23
24 /**
25 * 非核心线程闲置时超时1s
26 */
27 private static final int KEEP_ALIVE = 1;
28
29 private static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(THREAD_POOL_SIZE);
30
31 private ThreadPoolManager() {
32 }
33
34 private static class SingletonInner {
35 private static ThreadPoolManager instance = new ThreadPoolManager();
36 }
37
38 public static ThreadPoolManager getInstance() {
39 return SingletonInner.instance;
40 }
41
42 /**
43 * 开启一个无返回结果的线程
44 * @param r
45 */
46 public void execute(Runnable runnable) {
47 log.info("start a thread ->" + Thread.currentThread().getName());
48 // 把一个任务丢到了线程池中
49 executor.execute(runnable);
50 }
51
52 /**
53 * 开启一个有返回结果的线程
54 * @param runnable
55 * @return
56 */
57 public <T> Future<T> submit(Callable<T> runnable) {
58 // 把一个任务丢到了线程池中
59 return executor.submit(runnable);
60 }
61
62 /**
63 * 把任务移除等待队列
64 * @param runnable
65 */
66 public void cancel(Runnable runnable) {
67 if (runnable != null) {
68 executor.getQueue().remove(runnable);
69 }
70 }
71
72 /**
73 * 获取空闲线程数
74 * @return
75 */
76 public static int getFreeThreadNum() {
77 int freeNum = executor.getCorePoolSize() -executor.getActiveCount();
78 return freeNum;
79 }
80
81 }