Android Summarized

【Java】スレッドについてまとめてみました

投稿日:2019年11月25日 更新日:

はじめに

こんにちは、matsunariです。今回はJavaのスレッドについてまとめてみます。なんとなく理解はしていましたが、きちんと整理できていなかったので今回まとめてみようと思いました。スレッドをきちんと理解することでバグのないアプリ製作に役立てられればいいなと思っています。

スレッドの基本について

プログラムを実行する処理の最小単位を”スレッド”といいます。通常アプリはメインスレッドと呼ばれる一本のスレッド(シングルスレッド)の上で動きます。しかし、ネットワーク通信などのように処理に時間がかかる動作を行う場合、シングルスレッドでは通信が終わってからようやく次の処理に移ります。これでは、ユーザーは処理が終わるまで長時間待たなければなりません。Javaの世界ではメインスレッドだけではなく、複数のスレッドを並行して実行することができます。これをマルチスレッドと呼びます。マルチスレッドを利用することで、アプリが裏で通信を行なっている間でも、同時並行的に他の動作を行うことができます。

スレッドの利用

スレッドを利用するにはThreadクラスを継承することで実現できます。
主に以下のような2種類の方法を使います。
・Threadクラスを継承する
・Runnnableクラスを実装する

Threadクラス

まずはThreadクラスを使ってスレッドを作ってみましょう。

これでThreadクラスを継承したThreadBasicクラスができました。Threadクラスを使用するときは、必ずrun()メソッドをオーバーライドする必要があります。
このrun()メソッドはJavaでいうところmainメソッドのようなもので、スレッド開始時に呼び出されるエントリーポイントです。
ここにThreadで行いたい処理を書きましょう。
今回は0-50の間でカウントアップを行う処理行なっています。

それでは実際にスレッドを使って処理を行うとどのようになるのかみてみましょう。
MainActivityではThreadクラスをインスタンス化し、3つのスレッドを作りました。それぞれ、start()メソッドを実行して並行して実行します。


順番が交互になって処理結果が表示されています。
これで各スレッドで処理が並列的に実行されたことを確認できましたね。

Runnableインターフェース

同様にRunnableインタフェースを実装した場合はこのようになります。

生成&実行処理はこちらです。

Threadクラスとの違いはほとんどありません。

同期処理

別々の処理を並行的に実施できるとはいえ、同一のメモリ上で処理されるので、共有のデータに対して同時に処理を行った場合、不整合が発生するケースがあります。

これは50万個のスレッドを並行してカウントアップするプログラムです。
このプログラムを実行すると正しく動作しない可能性があります。
理由としては以下のようなケースが起こり得るからです。

BadCountクラスのcountUp()メソッドの処理で「変数の現在地を取得→値を加算→演算結果の再代入」という手順を行なっています。
処理の途中で他のスレッドの割り込みが入ると結果が正しく反映されない可能性があります。

synchronized修飾子

上述した不整合を防ぐために、synchronized修飾子を利用します。

synchronized修飾子が指定されると、そのメソッドが複数のスレッドから同時に呼び出されることがなくなります。ほぼ同時に呼び出されたとしても、先に呼び出した方の処理が優先され、先に呼び出された方で処理が完了するまで、次のスレッドで呼び出されず待ちの状態となります。このように特定の処理を占有することロックを獲得すると呼んだりもします。ロックを獲得して処理を行うことを同期処理と呼びます。

おわりに

今回はJavaのスレッド処理に関してまとめてみました。スレッドはまだ奥が深そうな分野なので、引き続き学習してブログでも発信していきたいと思っています。

おすすめ書籍

AndroidエンジニアのためのモダンJava[改訂新版]Android SDK ポケットリファレンススッキリわかるJava入門 第3版 (スッキリシリーズ)

page_footer_300rect




page_footer_300rect




-Android, Summarized
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

[Android] リソースフォルダの修飾子

1 はじめに2 画面の向き3 画面サイズ4 テキスト入力方法5 複数修飾子の組み合わせ6 その他7 さいごに はじめに Androidアプリではリソースフォルダ名に修飾子をつけることによって、様々な環 ...

Kotlin OkHttp3で通信を行なった際の備忘

1 はじめに2 ライブラリの導入方法3 Build時にエラーが発生する4 パーミッションの追加5 main関数で同期処理の通信6 onFailureでUnable to resolve host &# ...

AndroidでWebViewを使用するときに気をつけたいポイント追加4選!

1 はじめに2 Cookie2.1 Cookieを設定する2.2 Cookieを取得する3 ハンドリングの効かないページ遷移3.1 POSTでのページ遷移3.2 PDFなど、WebViewで開くことの ...

[Android] Firebase ML Kit勉強会に参加してきました

1 はじめに2 Firebase ML Kitとは3 準備するもの4 動かすまでの手順4.1 gradleのsyncがうまくいかない場合5 テキスト認識を試してみる6 画像のラベル付けを試してみる7 ...

Kotlinをはじめよう〜Kotlin基本文法〜

1 はじめに2 事前準備3 基本データ型4 変数5 条件分岐 if式6 条件分岐 when式7 繰り返し制御 while文8 繰り返し制御 for文9 さいごに10 おすすめ書籍 はじめに こんにちは ...

フォロー

follow us in feedly

page_side_300rect

2019年11月
« 10月 12月 »
 12
3456789
10111213141516
17181920212223
24252627282930

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。