Kotlinでスレッド処理【Androidアプリ開発】

Kotlinでスレッド処理【Androidアプリ開発】
Kotlinでスレッド処理【Androidアプリ開発】

KotlinのThreadクラスで、スレッドの作成とキャンセル処理を試してみた。この記事ではThreadの使い方を解説していく。

スレッド処理プロジェクトの全体の内容

スレッド動作のGIFアニメ
スレッド動作のGIFアニメ

この画像のように、Startボタンを押すとスレッドを新規作成して処理を走らせる。スレッドで行う処理は、1秒間隔でカウンタを1づつ上げそれを標準出力している。そして、Stopボタンを押すことでスレッドがキャンセルされる仕組みになっている。MainActivityクラスは次のようにプログラミングした。

kotlin
class MainActivity : AppCompatActivity() {

    var mWorker: Thread? = null
    var running = AtomicBoolean(false)
    var counter:Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.start).setOnClickListener {
            runWorker()
        }
        findViewById<Button>(R.id.stop).setOnClickListener {
            interruptWorker()
        }
    }

    fun runWorker() {
        running.set(true)
        mWorker = Thread {
            while (running.get()) {
                try {
                    Thread.sleep(1000)
                    counter++
                    println("counter $counter")
                } catch (ex: InterruptedException) {
                    Thread.currentThread().interrupt()
                    println("Thread was interrupted, Failed to complete operation")
                }

            }
        }
        mWorker?.start()
    }

    fun interruptWorker() {
        running.set(false)
        mWorker?.interrupt()
    }
}

Treadの作成

スレッドの新規作成とそのスレッドをスタートさせる基本的な形は次のようになる。

kotlin
mWorker = Thread { 
	...
	//処理内容
}
mWorker.start()

Treadをキャンセルさせる

スレッドをキャンセルさせたい場合はinterrupt()メソッドで行う。

kotlin
mWorker?.interrupt()

しかし、このままだとスレッド処理内で例外が投げられクラッシュしてしまうだろう。そこでスレッド内の処理をtry-catchで囲んで上げる必要がある。さらにcatch内ではThread.currentThread().interrupt()を再び実行することで、安全で確実なスレッドのキャンセルができる。

kotlin
try {
	...
	//処理内容
} catch (ex: InterruptedException) {
	Thread.currentThread().interrupt()
}

AtomicBoolean

AtomicBooleanは、複数スレッドから安全に同時アクセスできるboolean型である。ここではカウンターはInt型になっているが、厳密にはAtomicIntegerを利用すべきなのかもしれない。

参考

How to Kill a Java Thread | Baeldung Create thread - Android - Kotlin Discussions java - クラス AtomicBooleanについて。 - スタック・オーバーフロー

▼ こんな記事も書いてます。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事