通常のプログラムは処理は順番通り行われます。しかしある一つの処理を待っている場合に他の処理を平行でしたい場合はどうすれば良いでしょうか。JavaではThreadというクラスを用意されていてこれを利用することで処理を並行に行うことができます。
スレッドとは
Threadスレッドとは日本語では「縫い糸」という意味の他に「話の脈略」という意味もあります。Javaでは「処理の流れ」を指しています。
通常のメソッドの場合呼び出すとそこでの処理が終わらないと次の処理ができません。しかしスレッドの場合メインの処理の中でスレッドを開始させるとメインの処理ではすぐに次の処理を行うことができます。一方スレッドの方はこれとは別に処理を行います。
Hello Goodbyeテスト
スレッドの仕組みのわかる簡単なプログラムを書きます。題材はビートルズのHello Goodbyeという曲です。この曲では「私」がこんにちはと言って「君」がさようならといって関係の噛み合わない状況が歌われています。
スレッド用のクラスは「君」の処理を行います。スレッドはRunnableというインタフェースを実装する必要がありrunというメソッドに行う処理を書きます。処理の中で「君」はさようならと言って1秒待ちます。これを10回行います。
public class HelloGoodbye implements Runnable { static final long RECORD_TIME = 1000; @Override public void run() { for(int i = 0;i < 10;i++){ System.out.println("you say goodbye"); try { Thread.sleep(RECORD_TIME); } catch (InterruptedException ex) { } } } }
このクラスを使うメイン処理です。こちらは「君」のスレッドを作ってstartメソッドを呼びます。これによってrunメソッドに書かれた処理が行われます。このあと「私」の処理をおこないます。「私」は同じようにこんにちはを1秒間隔で10回言います。
HelloGoodbye helloGoodbye = new HelloGoodbye(); Thread you = new Thread(helloGoodbye); you.start(); for(int i = 0;i < 10;i++){ System.out.println("I say hello"); Thread.sleep(RECORD_TIME); }
以下実行結果です。別々に動いているため「君」のほうが続けて2回言うこともあれば「私」が2回続くこともあります。「私」と「君」で行われる処理が同期されていないことがわかります。
I say hello you say goodbye I say hello you say goodbye you say goodbye I say hello you say goodbye I say hello you say goodbye I say hello you say goodbye I say hello you say goodbye I say hello I say hello you say goodbye you say goodbye I say hello I say hello you say goodbye