再構成
ピカソもビルダーモードを使用するように変更されました。
このコミットにより、picasso は Builder パターンで構築されるようになり、ExecutorService のような異なる内部コンポーネントを簡単に設定できるようになりました。
feature
マルチスレッドの登場です。
Executors.c(0x3, new PicassoThreadFactory());
picasso のスレッドプールは singleThreadExecutor を使っていますが、今回は .NET に変更されています。つまり、最大3つのスレッドが同時にリクエストを処理することになり、後で並行処理の問題が発生します。
カスタムスレッド工場
上記のスレッド プールは、Picasso のカスタム スレッド ファクトリ クラスである PicassoThreadFactory オブジェクトを渡すことで生成されることがわかります。
static class PicassoThreadFactory implements ThreadFactory {
private static final AtomicInteger id = new AtomicInteger();
@SuppressWarnings("NullableProblems") public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("picasso-" + id.getAndIncrement());
t.setPriority(Process.THREAD_PRIORITY_BACKGROUND);
return t;
}
}
これによりスレッドの名前を設定することができ、デバッグ時に生成したスレッドだけを簡単に見ることができます。スレッドの優先度も設定できます。生成されたスレッドの名前にはスレッド数が含まれており、スレッド数は AtomicInteger であることに注意してください。"並行性の問題に対処しなければならないということです" と言った直後に遭遇したものです。
なぜ AtomicInteger
スレッド・プールによってスレッドが生成されるときにスレッド・ファクトリーが使用されますが、スレッド・プールがスレッドを生成することに並行性の問題はありますか?使い方によります。たとえば、PicassoThreadFactory の AtomicInteger id 変数は静的であるため、複数のスレッド プールが PicassoThreadFactory を使用する場合、同じ id を共有することになり、マルチスレッドの問題が発生する可能性があります。実際には、スレッド ファクトリのスレッド セーフ実装を記述するのが最善です。