Javaチュートリアル

Javaホーム Javaイントロ Javaはじめに Java構文 Javaコメント Java変数 Javaデータ型 Java型キャスト Java演算子 Java文字列 Java数学 Javaブール値 Java If ... Else Javaスイッチ JavaWhileループ JavaForループ Javaブレーク/続行 Java配列

Javaメソッド

Javaメソッド Javaメソッドパラメータ Javaメソッドのオーバーロード Javaスコープ Java再帰

Javaクラス

Java OOP Javaクラス/オブジェクト Javaクラス属性 Javaクラスメソッド Javaコンストラクタ Java修飾子 Javaカプセル化 Javaパッケージ/ API Javaの継承 Javaポリモーフィズム Java内部クラス Java抽象化 Javaインターフェイス Java列挙型 Javaユーザー入力 Java日付 Java ArrayList Java LinkedList Java HashMap Java HashSet Javaイテレータ Javaラッパークラス Javaの例外 Java RegEx Javaスレッド Javaラムダ

Javaファイル処理

Javaファイル Javaのファイルの作成/書き込み Java読み取りファイル Javaファイルの削除

Javaハウツー

2つの数字を追加する

Javaリファレンス

Javaキーワード Java文字列メソッド Java数学メソッド

Javaの例

Javaの例 Javaコンパイラ Java演習 Javaクイズ Java証明書


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++;
  }
}