スレッドについてまとめてみた
今回はスレッドについてです。
スレッドとは
Javaでは、処理の流れを複数持つことができる。このような処理の流れの1つ1つをスレッドと呼ぶ。複数のスレッドを起動して効率良く処理を行うことができる。たとえば、ループしている処理の裏で、他の処理ができる。
class A extends Thread { public void run(){ //別のスレッドで行いたい処理 } }
スレッドを起動するにはこのように書く。
実際にプログラムを書く際には
class A extends Thread { フィールドやコンストラクタなど public void run(){ //処理 } } class Sample{ public static void main(String[] args){ A a = new A(); a.start(); } }
このように書きます。
スレッドを起動させるには、まずThreadクラスを拡張したクラスのオブジェクトを作成し、その変数名でstart()メソッドを呼び出す。このとき、呼び出されるのはstart()メソッドだが、一番最初に実行されるのはrun()メソッドである。このとき、start()メソッドはインスタンスメソッドのため、事前にオブジェクトを作成して、オブジェクト名.start();で呼び出す必要がある。
スレッドの操作
sleep()メソッド
スレッドを一時停止することができる。Threadクラスを拡張したクラス内にsleep(1000);と記述することで1秒停止できる。逆に、mainメソッド内にThread.sleep(1000);と書くことで、mainメソッドの処理を1秒間停止できる。ミリ秒で記載する。また、sleep()メソッドはThreadクラスのクラスメソッドなのでThreadクラスを拡張したクラスであれば、sleep()単体で呼び出すことができる。mainメソッド内などではThread.sleep();と記述することで呼び出すことができる。
注意点として、sleep()メソッドはエラーを投げる可能性があるので、try-catch文を書く必要がある。このとき投げる可能性のある例外はInterruptedException。
Threadの作成方法
Threadを作成するには、Threadクラスを継承する他に、Runnableインターフェイスを実装する方法がある。ただし、start()などのインスタンスメソッドを呼び出す際には、Runnableインターフェイスを実装したクラスのオブジェクトを作成した上で、そのオブジェクト名を引数にしてThreadクラスのオブジェクトを作成して初めて、スレッドを起動することができる。
同期
スレッドは便利だが、複数のスレッドを起動する際に注意点がある。オブジェクトを2つ作成して、それぞれでスレッドを起動して処理を行う際に、同時に処理をしてしまい競合が起きてしまう。そこで、メソッドにsynchronizedという指定をつけると、あるスレッドがメソッドを処理している間は、ほかのスレッドがメソッドを呼び出せなくなる。
今回はこのぐらいで。
まだまだ基本的な部分しか学んでいませんのでこれからも続けてJavaを勉強していきます。
もしこれを読んでくださった方で、良い参考書とかおススメのものあるよ!って方は
コメントで教えていただけると幸いです。
記事の誤表記等も合わせてよろしくお願い致します。