Javaスレッド
Javaスレッド
スレッドを使用すると、複数の処理を同時に実行することで、プログラムをより効率的に動作させることができます。
スレッドを使用すると、メインプログラムを中断することなく、バックグラウンドで複雑なタスクを実行できます。
スレッドの作成
スレッドを作成する方法は2つあります。
クラスを拡張し、そのメソッドThread
をオーバーライドすることで作成できます。run()
構文の拡張
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
スレッドを作成する別の方法は、Runnable
インターフェースを実装することです。
構文の実装
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
実行中のスレッド
クラスがクラスを拡張する場合、クラスのインスタンスを作成してそのメソッドThread
を呼び出すことにより、スレッドを実行できます。start()
例を拡張する
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
クラスがインターフェースを実装している場合、クラスRunnable
のインスタンスをオブジェクトのコンストラクターに渡し、スレッドのメソッドThread
を呼び出すこと
で、スレッドを実行できます。start()
実装例
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
「拡張」スレッドと「実装」スレッドの違い
主な違いは、クラスがThreadクラスを拡張する場合、他のクラスを拡張できないことですが、Runnableインターフェイスを実装することにより、classのように別のクラスからも拡張できますMyClass extends OtherClass implements Runnable
。
並行性の問題
スレッドはプログラムの他の部分と同時に実行されるため、コードが実行される順序を知る方法はありません。スレッドとメインプログラムが同じ変数を読み書きしている場合、値は予測できません。これに起因する問題は、並行性の問題と呼ばれます。
例
可変量の値が予測できないコード例:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
同時実行の問題を回避するには、スレッド間で共有する属性をできるだけ少なくするのが最善です。属性を共有する必要がある場合、考えられる解決策の1つは、スレッドのisAlive()
メソッドを使用して、スレッドが変更できる属性を使用する前に、スレッドの実行が終了したかどうかを確認することです。
例
isAlive()
同時実行の問題を防ぐために使用します。
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}