【Java入門】Threadをsleepメソッドで一定時間停止する方法

こんにちは!フリーライターの中井です。

Javaにはスレッドの処理を一時停止させるsleepメソッドがあります。この記事では、

  • スレッドとは?
  • sleepメソッドとは?
  • sleepメソッドの使い方
  • という基本的な内容から、

  • スリープ中に割り込まれると例外が発生すること
  • sleepメソッドは誤差が出ること
  • などの応用的な使い方に関しても解説していきます。

    スレッド(Thread)とは

    スレッドとは、処理の実行単位の一つで、プログラムの初めから終わりまでの一連の流れのことを言います。

    専門的な言い方になりますが、実はHello,Worldを出力するプログラムも一連のスレッドになります。

    更にスレッドは、シングルスレッドとマルチスレッドの2種類に分かれます。

    シングルスレッドとは?

    シングルスレッドは、別名直列処理とも呼ばれています。

    例えば、夏休みの宿題に英語の問題集と数学の問題集があるとします。
    シングルスレッドの場合は英語の問題集をスタートさせて、終わってから数学の問題集をスタートします。

    覚え方としては、初めの処理が終わってから次の処理をすると理解しておきましょう。

    つまり、プログラムの始まりから終わりまでが一本道で処理されるのがシングルスレッドとなります。

    マルチスレッドとは?

    一方マルチスレッドは、別名並行処理とも呼ばれています。シングルスレッドと同じように夏休みの宿題で例えると、マルチスレッドの場合は英語の問題集と数学の問題集に同時に取り組みます。

    覚え方としては、2つ以上の処理を並行して行うと理解しておきましょう。マルチスレッドを利用するには、

  • 1. Threadクラスを継承するクラスを作成する
  • 2. Threadクラスを継承するクラスでrunメソッドを実行する
  • 3. Threadクラスを継承するクラスのインスタンスを生成する
  • 4. 生成したインスタンスに対してstartメソッドを実行する
  • となります。以下にマルチスレッドを実行する簡単なサンプルを紹介します。

    実行結果

    サンプルプログラムでは、マルチスレッドを行うためにThreadクラスを継承したMultiThread1クラスとMultiThread2クラスを作成し、mainメソッドからstartメソッドでスレッドを実行しています。

    実行結果から分かるとおり、スレッドによる並行処理が実施されていることがわかりますね!

    sleepメソッドとは

    sleepメソッドとは、プログラムを一時停止するときに使用します。

    とくにマルチスレッドで使用することが多いメソッドです。sleepメソッドの定義は以下のようになっています。

    sleepメソッドを使用するメリットとして、マルチスレッドの並列処理で無限ループを実行していた場合、CPUの負荷が大きくなりリソースを消費してメモリリークなどPCの動作が重くなる要因となってしまいます。

    そのため、マルチスレッドの処理中にsleepメソッドを使用して、処理を一時停止すればCPUの負荷を抑えられることができます。

    sleepメソッドの使い方

    ここでは実際にsleepメソッドの使い方を見ていきましょう。

    以下にsleepメソッドを使用した簡単なサンプルを記述します。

    実行結果

    このプログラムではsleepメソッドを使って、処理を5秒間停止させています。例外にはtry-catch文で対処しています。

    sleepメソッドのポイントは以下の2つです。

  • sleepメソッドの引数はlong型を使用、単位はミリ秒(1000ミリ秒 = 1秒)
  • sleepメソッドを使う場合には必ず例外処理をすること
  • マルチスレッドでsleepを実行

    ここでは、マルチスレッドの並行処理でsleepメソッドを使用する方法を紹介しています。

    実際のシステムでも、以下のサンプルのようにマルチスレッドでsleepメソッドを使用する機会は多いので、ぜひ覚えておきましょう。

    実行結果

    サンプルではThreadクラスを継承したMultiThread1クラスとMultiThread2クラスでrun()メソッドでスレッドを実行し、for文の中でsleepメソッドを使用しています。

    sleepメソッドの注意点

    sleepメソッドの注意点は、以下の2つです。

  • interruptedExceptionの例外が発生すること
  • sleepメソッドでは精度が低く誤差が生じること
  • interruptedExceptionの例外に対処する方法

    interruptedExceptionの例外は、sleepメソッドで待機中にinterruptメソッドで割り込みが発生したときに発生します。

    必要に応じて例外に対処するプログラムを書いてください。interruptedExceptionの例外に対処する方法を覚えるために、次のソースコードで確認してみましょう。

    実行結果

    まずこのプログラムはrunメソッドが待機状態になるのを待つために500ミリ秒待機します。

    その後interruptメソッドで待機中のrunメソッドに割り込み、interruptedExceptionの例外を発生させています。

    sleepメソッドで誤差が発生する問題

    sleepメソッドはプログラムを実行する環境によっては誤差が発生する場合があります。

    そのため、高い精度が必要な処理では使わないようにしてください。次のプログラムで誤差を計測してみましょう。

    実行結果

    プログラムの実行結果から、sleepメソッドで誤差が発生することを確認できました。

    Threadクラスについてもっと知りたい方へ

    紹介したようにThreadクラスを使用すれば、同時並行で処理を実行することが可能です。

    実際のシステムでマルチスレッドを使用したプログラムは多いので、仕組みはぜひ覚えておきましょう。

    この記事では紹介しきれなかったThreadクラスのいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!

    まとめ

    この記事ではsleepメソッドの使い方について解説しました。

    sleepメソッドで待機中にinterruptメソッドで割り込みを行うと、interruptedExceptionの例外が発生するので注意してくださいね。

    もし、sleepメソッドの使い方を忘れてしまったらこの記事を確認してくださいね!

    LINEで送る
    Pocket

    最短でエンジニアを目指すなら侍エンジニア塾

    cta_under_bnr

    侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

    あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

    無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

    無料体験レッスンの詳細はこちら

    書いた人

    中井

    中井

    フリーライター。
    主に美容系、ライフスタイル系含めこれまでに500本以上執筆。
    趣味はオンラインゲームにフリーソフトの情報収集。

    プログラミンとの出会い
    -----------------------------------------------------------------------------------------
    PCとプログラミングは大学からです。
    それまでは、PCは触ると壊れると思い込んでました。

    大学の授業で面白そうな理由でJavaを専攻。
    全然授業についていけず、後ろの席の子に課題をやってもらってました。

    そんなプログラミング音痴な状態で社会人を迎え、先輩からVBAがオススメと言われVBAを職場の人から教えてもらい習得。
    その後、自分の業務に携わるものおは全てVBAを組みました。

    会社を退職後、再度Javaを勉強する機会に恵まれ、大学でわからなかったことが一気に理解できるように。
    念願のAndroidアプリでTwitterのクライアントアプリを作れるまでになりました。
    以後、文章の修行の傍らJavaの最新情報を追う日々が続いています。

    おすすめコンテンツ

    あなたにぴったりなプログラミング学習プランを無料で診断!

    プログラミング学習の効率を劇的に上げる学習メソッドを解説