はじめに
皆さん。こんにちは!
DreamHanksの254cmです。
今回はThreadについて説明していきます。
Java記事のまとめはこちらです。
前回の記事は【Java開発】第29回 匿名内部クラスです。
Threadとは?
スレッド(Thread)はJavaプログラムで作業を処理するものであり、すべてのJavaプログラムは一個以上のスレッドを持っています。
スレッドは一つの作業を担当して処理します。つまり、複数のスレッドが存在すると複数の作業を同時に処理することができます。
main()メソッドが基本的に提供されるスレッドであり、main()以外のスレッドを作るためには
Threadクラスを継承するか、Runnableインターフェースを実装します。
二つ以上のスレッドを運用しているのをMultithreadingと呼びます。
Threadの使い方
サンプル1
1 2 3 4 5 6 7 8 9 10 11 |
public class ThreadSample extends Thread{ public static void main(String[] args) { ThreadSample tSample = new ThreadSample(); tSample.start(); } public void run() { System.out.println("Excute run method"); } } |
基本的な使い方はスレッドを使用したいクラスにThreadクラスを継承させて、
スレッドが処理する作業をrunメソッドに作成します。
そして、Threadオブジェクトのインスタンスを生成してstartメソッドを使用します。
スレッドのstartメソッドはrunメソッドを実行すると設計されています。
実行結果
1 |
Excute run method |
サンプル2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package practiceProject; public class ThreadSample extends Thread{ public static void main(String[] args) { ThreadSample thread1 = new ThreadSample(); ThreadSample thread2 = new ThreadSample(); thread1.start(); thread2.start(); System.out.println("main method end"); } public void run() { for(int i = 0; i < 10; i++) { System.out.println(getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
上記のサンプルは二つのスレッドを生成して処理を行っています。
Thread.sleep()メソッドはメソッドの実行を引数分だけ止まるメソッドです。
getNameメソッドは現在実行中のスレッドの名前を返還するメソッドです。
上記のサンプルを実行してみると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
main method end Thread-1 Thread-0 Thread-0 Thread-1 Thread-0 Thread-1 Thread-1 Thread-0 Thread-1 Thread-0 Thread-0 Thread-1 Thread-0 Thread-1 Thread-1 Thread-0 Thread-0 Thread-1 Thread-0 Thread-1 |
になります。
二つのスレッドの処理が終わる前にmainメソッドが終了されます。
もし、mainメソッドがスレッドで処理された値をもらって実行しなければならない作業がある場合、
スレッドが終了される前にmainメソッドが終了されてエラーが発生します。
サンプル3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class ThreadSample extends Thread{ public static void main(String[] args) { ThreadSample thread1 = new ThreadSample(); ThreadSample thread2 = new ThreadSample(); thread1.start(); try { thread1.join(); } catch (InterruptedException e) { e.printStackTrace(); } thread2.start(); try { thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main method end"); } public void run() { for(int i = 0; i < 5; i++) { System.out.println(getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
上記のようにjoinメソッドを使うとjoinメソッドを呼び出したスレッドが終了されるまで、
次の動作を実行しません。
実行結果
1 2 3 4 5 6 7 8 9 10 11 |
Thread-0 Thread-0 Thread-0 Thread-0 Thread-0 Thread-1 Thread-1 Thread-1 Thread-1 Thread-1 main method end |
サンプル4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class ThreadSample implements Runnable{ public static void main(String[] args) { Thread th = new Thread(new ThreadSample()); th.start(); } @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()); } } } |
Runnableインターフェースを継承してスレッドを使用するサンプルです。
Threadクラスを継承することと大差はありませんが、
runメソッドのオーバーライドを強制することができる長点があります。
実行結果
1 2 3 4 5 |
Thread-0 Thread-0 Thread-0 Thread-0 Thread-0 |
Threadの優先順位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public class ThreadSample extends Thread{ public static void main(String[] args) { ThreadSample th0 = new ThreadSample(); ThreadSample th1 = new ThreadSample(); ThreadSample th2 = new ThreadSample(); ThreadSample th3 = new ThreadSample(); th0.setPriority(MIN_PRIORITY); th1.setPriority(MAX_PRIORITY); th2.setPriority(MIN_PRIORITY); th3.setPriority(MIN_PRIORITY); System.out.println(th0.getPriority()); System.out.println(th1.getPriority()); System.out.println(th2.getPriority()); System.out.println(th3.getPriority()); th0.start(); th1.start(); th2.start(); th3.start(); } public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
スレッドは優先順位を表すフィールドを持っています。そのフィールドを操作することで各スレッドの処理の優先順位を決定することができます。
優先順位によって該当スレッドはより多くの時間に処理を行うことができます。
getPriorityとsetPriorityメソッドを利用して優先順位のフィールドを操作することができます。
優先順位が高いほどより多くの時間に処理を行うし、優先順位の範囲は1から10までです。
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
1 10 1 1 Thread-0 Thread-1 Thread-2 Thread-3 Thread-1 Thread-2 Thread-0 Thread-3 Thread-1 Thread-3 Thread-2 Thread-0 Thread-1 Thread-0 Thread-3 Thread-2 Thread-3 Thread-2 Thread-0 Thread-1 |
終わりに
今回の記事は以上になります。
ご覧いただきありがとうございます。
コメント