hjg
2024-02-05 301115d5e96b56cd093eee3fcff2d60a15184162
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.mandi.fendan.util;
 
import javax.validation.constraints.NotNull;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
 
/**
 * 线程池的工具类
 * 用于进行线程的管理,防止重复创建、杀死线程。
 *
 
 * 多线程运行期间,如果系统不断的创建、杀死新线程,
 * 会产生过度消耗系统资源,以及过度切换线程的问题,甚至可能导致系统资源的崩溃。
 * 因此需要线程池,对线程进行管理。
 */
public class ThreadPoolUtil {
 
    private String TAG = getClass().getName();
    private static volatile ThreadPoolUtil mInstance;
    //核心线程池的数量,同时能够执行的线程数量
    private int corePoolSize;
    //最大线程池数量,表示当缓冲队列满的时候能继续容纳的等待任务的数量
    private int maxPoolSize;
    //存活时间
    private long keepAliveTime = 1;
    private TimeUnit unit = TimeUnit.HOURS;
//    private ThreadPoolExecutor executor;
 
    ScheduledThreadPoolExecutor executor;
    private ThreadPoolUtil() {
        //给corePoolSize赋值:当前设备可用处理器核心数*2 + 1,能够让cpu的效率得到最大程度执行(有研究论证的)
        corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1;
        maxPoolSize = corePoolSize;
//        executor = new ThreadPoolExecutor(
//                //当某个核心任务执行完毕,会依次从缓冲队列中取出等待任务
//                corePoolSize,
//                // 然后new LinkedBlockingQueue(),然后maximumPoolSize,但是它的数量是包含了corePoolSize的
//                maxPoolSize,
//                //表示的是maximumPoolSize当中等待任务的存活时间
//                keepAliveTime,
//                unit,
//                //缓冲队列,用于存放等待任务,Linked的先进先出
//                new LinkedBlockingQueue(),
//                new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"),
//                new ThreadPoolExecutor.AbortPolicy()
//        );
          executor =  new ScheduledThreadPoolExecutor(corePoolSize);
    }
 
    public static ThreadPoolUtil getInstance() {
        if (mInstance == null) {
            synchronized (ThreadPoolUtil.class) {
                if (mInstance == null) {
                    mInstance = new ThreadPoolUtil();
                }
            }
        }
        return mInstance;
    }
 
    /**
     * 执行任务
     *
     * @param runnable
     */
    public void execute(Runnable runnable) {
        checkNull();
        if (runnable != null) {
            executor.execute(runnable);
        }
    }
 
    void checkNull() {
        if (executor == null) {
//            executor = new ThreadPoolExecutor(
//                    corePoolSize,
//                    maxPoolSize,
//                    keepAliveTime,
//                    TimeUnit.SECONDS,
//                    new LinkedBlockingQueue(),
//                    new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"),
//                    new ThreadPoolExecutor.AbortPolicy());
            executor =  new ScheduledThreadPoolExecutor(corePoolSize,
                    new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"),
                    new ThreadPoolExecutor.AbortPolicy());
        }
    }
    /**
     *
     * @param runnable
     * @param delay 延迟执行,单位毫秒
     */
    public void execute(Runnable runnable,long delay) {
        checkNull();
        if (runnable != null) {
            executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
        }
    }
 
    /**
     * 移除任务
     *
     * @param runnable
     */
    public void remove(Runnable runnable) {
        if (runnable != null) {
            executor.remove(runnable);
        }
    }
 
    private static class DefaultThreadFactory implements ThreadFactory {
        //线程池的计数
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        //线程的计数
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final String namePrefix;
        private final int threadPriority;
 
        DefaultThreadFactory(int threadPriority, String threadNamePrefix) {
            this.threadPriority = threadPriority;
            this.group = Thread.currentThread().getThreadGroup();
            this.namePrefix = threadNamePrefix + poolNumber.getAndIncrement() + "-thread-";
        }
 
        @Override
        public Thread newThread(@NotNull Runnable r) {
            Thread thread = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
            // 返回True该线程就是守护线程
            // 守护线程应该永远不去访问固有资源,如:数据库、文件等。因为它会在任何时候甚至在一个操作的中间发生中断。
            if (thread.isDaemon()) {
                thread.setDaemon(false);
            }
            thread.setPriority(threadPriority);
            return thread;
        }
    }
}