blog

Picassoソースコミットメモ: マルチスレッドに対応する!

このコミットにより、picasso は Builder パターンで構築されるように変更されました。 picasso が使用するスレッドプールは ... に変更されました。...

Nov 22, 2020 · 2 min. read
シェア

再構成

ピカソもビルダーモードを使用するように変更されました。

このコミットにより、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 を共有することになり、マルチスレッドの問題が発生する可能性があります。実際には、スレッド ファクトリのスレッド セーフ実装を記述するのが最善です。

Read next

DVWAを配置する

アカウント:admin、パスワード:passwordを入力し、ログインします。以下のページが表示されればログイン成功です。

Nov 22, 2020 · 1 min read