Android 在线程池中实现线程优先级的代码实现
在前文《Android 中设置线程优先级的正确方式(2种方法)》中,我们知道,设置线程优先级,最好使用 Android 推荐的 android.os.Process 类的 setThreadPriority 方法。该方法需要在需要在线程执行时调用,也就是需要在 run 方法里面调用。
单个线程执行时,非常简单,那如果我们需要在线程池里设置现场优先级,又如何操作呢?
这里我直接给出了一个模板示例,按照自己的需要修改参数即可:
package com.budaye.simpledemo;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 异步线程池
*
* @author bu
*/
public class AsyncThreadTask { private final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); //cup内核数 private final int DEAFULT_THREAD_COUNT = CPU_COUNT + 3; //默认核心线程数 private final int KEEP_ALIVE = 3; //空线程alive时间 private ExecutorService mThreadPool; //线程池 private ThreadFactory mBackgroundThreadFactory = new PriorityThreadFactory(Process.THREAD_PRIORITY_BACKGROUND); private InternalHandler mHandler; private static AsyncThreadTask instance; public static AsyncThreadTask getInstance() { if (instance == null) { synchronized (AsyncThreadTask.class) { if (instance == null) { instance = new AsyncThreadTask(); } } } return instance; } /** * 构造函数 */ private AsyncThreadTask() { // 创建线程池 mThreadPool = new ThreadPoolExecutor(DEAFULT_THREAD_COUNT, DEAFULT_THREAD_COUNT, KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue(10000), mBackgroundThreadFactory, new ThreadPoolExecutor.DiscardOldestPolicy()); } /** * 异步线程执行任务 * * @param runnable */ public static void execute(Runnable runnable) { AsyncThreadTask.getInstance().executeRunnable(runnable); } /** * 异步线程执行延迟任务 * * @param runnable * @param delayedTime */ public static void executeDelayed(Runnable runnable, long delayedTime) { AsyncThreadTask.getInstance().executeRunnableDelayed(runnable, delayedTime); } public static void executeDelayedToUI(Runnable runnable, long delayedTime) { AsyncThreadTask.getInstance().executeRunnableDelayedToUI(runnable, delayedTime); } private void executeRunnableDelayedToUI(final Runnable runnable, long delayedTime) { getHandler().postDelayed(runnable, delayedTime); } private void executeRunnable(Runnable runnable) { mThreadPool.execute(runnable); } private void executeRunnableDelayed(final Runnable runnable, long delayedTime) { getHandler().postDelayed(new Runnable() { @Override public void run() { mThreadPool.execute(runnable); } }, delayedTime); } private Handler getHandler() { synchronized (this) { if (mHandler == null) { mHandler = new InternalHandler(); } return mHandler; } } private static class InternalHandler extends Handler { public InternalHandler() { super(Looper.getMainLooper()); } @Override public void handleMessage(Message msg) { } } public class PriorityThreadFactory implements ThreadFactory { private final AtomicInteger mCount = new AtomicInteger(1); private final int mThreadPriority; public PriorityThreadFactory(int threadPriority) { mThreadPriority = threadPriority; } @Override public Thread newThread(final Runnable runnable) { Runnable riorityRunnable = new Runnable() { @Override public void run() { Process.setThreadPriority(mThreadPriority); runnable.run(); } }; return new Thread(riorityRunnable, “AsyncThreadTask #” + mCount.getAndIncrement()); } }
}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
**PS:更多精彩内容,请查看 –> 《Android 开发》
**PS:更多精彩内容,请查看 –> 《Android 开发》
**PS:更多精彩内容,请查看 –> 《Android 开发》
文章来源: blog.csdn.net,作者:卜大爷,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/u011578734/article/details/110524802