読者です 読者をやめる 読者になる 読者になる

スレッドについてまとめてみた

今回はスレッドについてです。

スレッドとは

 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。

join()メソッド

 スレッドの終了を待つことができる。join()メソッドを呼び出すと、そのオブジェクトに関連づけられているスレッドが終了するまで、呼び出しをしたスレッド側が待つ。join()メソッドも同じようにInterruptedExceptionが送出される可能性がある。また、join()メソッドもstart()メソッドと同じくインスタンスメソッドであるので、事前にオブジェクトを作成し、オブジェクト名.join();で呼び出す必要がある。

Threadの作成方法

 Threadを作成するには、Threadクラスを継承する他に、Runnableインターフェイスを実装する方法がある。ただし、start()などのインスタンスメソッドを呼び出す際には、Runnableインターフェイスを実装したクラスのオブジェクトを作成した上で、そのオブジェクト名を引数にしてThreadクラスのオブジェクトを作成して初めて、スレッドを起動することができる。

同期

 スレッドは便利だが、複数のスレッドを起動する際に注意点がある。オブジェクトを2つ作成して、それぞれでスレッドを起動して処理を行う際に、同時に処理をしてしまい競合が起きてしまう。そこで、メソッドにsynchronizedという指定をつけると、あるスレッドがメソッドを処理している間は、ほかのスレッドがメソッドを呼び出せなくなる。



今回はこのぐらいで。
まだまだ基本的な部分しか学んでいませんのでこれからも続けてJavaを勉強していきます。
もしこれを読んでくださった方で、良い参考書とかおススメのものあるよ!って方は
コメントで教えていただけると幸いです。

記事の誤表記等も合わせてよろしくお願い致します。