ここまでの演習で行ってきたことはすべてシングルスレッドであったが
Javaは同時にいくつもの処理を並列に行えるマルチスレッドプログラミング言語だ。
この仕組みのおかげて重たい処理をバックグラウンドで走らせたり、複数の処理を並列にこなして効率化を図ることができる。
さっそく並列処理(マルチスレッド)をやってみよう。
スレッドはね。
Threadクラスのインスタンスが
startすると走るんだよ。
何が?
runが。
[スレッドの作り方]
runメソッドの持ち方が主に二つあるので一つずつやっていこう。
●Threadクラスを継承したクラスを作ってrunメソッドをオーバーライドする。
class MyThreadA extends Thread{ @Override public void run() { 処理 } }
こうして作られたクラスはnewしてstartするだけだ。
Thread thA=new MyThreadA(); thA.start();//=>新しい一本のスレッドが生成されrunメソッドが走る。
●Runnableインターフェイスを実装したクラスを作りrunメソッドをオーバーライドする。
class MyThreadB implements Runnable{ @Override public void run() { 処理 } }
この場合はThreadクラスのコンストラクタにインスタンスを渡してあげる。
Thread thB=new Thread(new MyThreadB()); thB.start();//=>新しい一本のスレッドが生成されMyThreadBに記述したrunメソッドが走る。
Threadクラスのインスタンスがstartすると新しいスレッドが開始されることに変わりはない。
runの持ち方が2種類あるだけだ。
スレッドはね。
Threadクラスのインスタンスが
startすると走るんだよ。
何が?
runが。
では動く形のソースコードに落とし込んでみよう。
public class ThreadLesson { public static void main(String[] args) { Thread thA=new ThreadA(); thA.start(); Thread thB=new Thread(new ThreadB()); thB.start(); for(int i=0;i<100;i++){ System.out.println("main:"+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } class ThreadA extends Thread{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println("thA:"+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } class ThreadB implements Runnable{ @Override public void run() { for(int i=0;i<100;i++){ System.out.println("thB:"+i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }
メインスレッドの他に2本のスレッドを走らせた処理だ。
3つの処理が並列に行われてるのが実行結果からもわかる。
(流れをわかりやすくするためにそれぞれThread.sleep(100)で100ミリ秒止めながら処理をしている)
[実行結果]
thA:0 thB:0 main:0 thB:1 thA:1 main:1 thB:2 main:2 ・ ・ 以下略
上の例では実クラスをつくってスレッドを作ったが、匿名のインナー型で行うことも多いので以下にそのサンプルを示す。
new Thread(new Runnable(){ @Override public void run() { 処理 } }).start();
どんな書き方をしようとも基本的な考え方は変わらない。
スレッドはね。
Threadクラスのインスタンスが
startすると走るんだよ。
何が?
runが。
この言葉をしっかり心に刻んだのちに以下の練習問題をやってみよう。
Q1
メインスレッドの他にもう1本新しくスレッドを生成し、
以下の二つの処理を並列処理させよ。
●3の倍数を10ミリ秒止めながら999まで出力する処理
●5の倍数を10ミリ秒止めながら1000まで出力する処理
[実行例]
main:5 Sub:3 main:10 Sub:6 main:15 Sub:9 main:20 Sub:12 main:25 Sub:15 main:30 ・ ・ ・ 略
●アプリケーションクラス
public class ThreadLesson2 { public static void main(String[] args) { //匿名のインナー型でスレッドを作り実行 new Thread(new Runnable(){ @Override public void run() { for(int i=3;i<=999;i+=3){ System.out.println("Sub:"+i); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); //メインスレッドのfor文 for(int i=5;i<=1000;i+=5){ System.out.println("main:"+i); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }
コメント