我们看看使用线程池的时候,怎么给线程设置优先级,Glide里面有很好的例子,是在ThreadFactory里面设置的
/**
* A {@link java.util.concurrent.ThreadFactory} that builds threads slightly above priority {@link
* android.os.Process#THREAD_PRIORITY_BACKGROUND}.
*/
private static final class DefaultThreadFactory implements ThreadFactory {
private static final int DEFAULT_PRIORITY = android.os.Process.THREAD_PRIORITY_BACKGROUND
+ android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE;
private final String name;
@Synthetic final UncaughtThrowableStrategy uncaughtThrowableStrategy;
@Synthetic final boolean preventNetworkOperations;
private int threadNum;
DefaultThreadFactory(String name, UncaughtThrowableStrategy uncaughtThrowableStrategy,
boolean preventNetworkOperations) {
this.name = name;
this.uncaughtThrowableStrategy = uncaughtThrowableStrategy;
this.preventNetworkOperations = preventNetworkOperations;
}
@Override
public synchronized Thread newThread(@NonNull Runnable runnable) {
final Thread result = new Thread(runnable, "glide-" + name + "-thread-" + threadNum) {
@Override
public void run() {
// why PMD suppression is needed: https://github.com/pmd/pmd/issues/808
android.os.Process.setThreadPriority(DEFAULT_PRIORITY); //NOPMD AccessorMethodGeneration
if (preventNetworkOperations) {
StrictMode.setThreadPolicy(
new ThreadPolicy.Builder()
.detectNetwork()
.penaltyDeath()
.build());
}
try {
super.run();
} catch (Throwable t) {
uncaughtThrowableStrategy.handle(t);
}
}
};
threadNum++;
return result;
}
}
还可以用另外一种方式:
ActiveResources(boolean isActiveResourceRetentionAllowed) {
this(
isActiveResourceRetentionAllowed,
java.util.concurrent.Executors.newSingleThreadExecutor(
new ThreadFactory() {
@Override
public Thread newThread(@NonNull final Runnable r) {
return new Thread(
new Runnable() {
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
r.run();
}
},
"glide-active-resources");
}
}));
}