Java でスレッドを強制終了する

Rupam Yadav 2023年10月12日
  1. Java で boolean フラグを使用してスレッドを強制終了または停止する
  2. Java で interrupt() を使用してスレッドを終了または停止させる
Java でスレッドを強制終了する

Java のスレッドを使用すると、複数のタスクを並行して実行できるので、マルチタスクが可能になります。Java では Thread クラスを使ってスレッドを作成することができます。この記事では、スレッドを終了させるための 2つのメソッドを紹介します。

スレッドはすべてのタスクを完了すると Thread クラスの run() メソッドによって破棄されますが、スレッドの実行が完全に終了する前にスレッドを kill したり停止したりしたい場合もあるでしょう。

Java で boolean フラグを使用してスレッドを強制終了または停止する

スレッドを明示的に強制終了するには、タスクを停止するタイミングをスレッドに通知するブーリアンフラグを使用します。下の例では、2つのスレッドがそのスレッド名の行を表示し、その後、両方のスレッドが約 100 ミリ秒の間スリープします。スレッドは、ブール値フラグ exitThread が真になるまで実行されます。

thread1thread2 は作成された 2つのスレッドであり、引数として名前が渡されています。クラス ExampleThread のコンストラクタにはスレッドの実行を開始する thread.start() があるので、両方のスレッドが実行されることになります。並列に実行されているため、出力には両方のスレッドの名前がランダムに表示されていることがわかります。

スレッドを停止させるには、ExampleThread のメソッドである stopThread() を呼び出して exitThreadtrue に設定し、while(!exitThread)false になることでスレッドが最終的に停止します。

public class KillThread {
  public static void main(String[] args) {
    ExampleThread thread1 = new ExampleThread("Thread One");
    ExampleThread thread2 = new ExampleThread("Thread Two");

    try {
      Thread.sleep(500);
      thread1.stopThread();
      thread2.stopThread();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("**Exiting the main Thread**");
  }
}

class ExampleThread implements Runnable {
  private String name;
  private boolean exitThread;
  Thread thread;

  ExampleThread(String name) {
    this.name = name;
    thread = new Thread(this, name);
    System.out.println("Created Thread: " + thread);
    exitThread = false;
    thread.start();
  }

  @Override
  public void run() {
    while (!exitThread) {
      System.out.println(name + " is running");
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }

    System.out.println(name + " has been Stopped.");
  }

  public void stopThread() {
    exitThread = true;
  }
}

出力:

Created Thread: Thread[Thread One,5,main]
Created Thread: Thread[Thread Two,5,main]
Thread Two is running
Thread One is running
Thread Two is running
Thread One is running
Thread One is running
Thread Two is running
Thread One is running
Thread Two is running
Thread One is running
Thread Two is running
**Exiting the main Thread**
Thread Two has been Stopped.
Thread One has been Stopped.

Java で interrupt() を使用してスレッドを終了または停止させる

ここでは先ほどの例を使いますが、interrupt() という新しいメソッドを追加します。この関数は、スレッド上で呼び出されたときに即座に実行を停止します。この例では、thread.isInterrupted() を用いて、interrupt() が呼ばれたかどうかを確認しています。

両方のスレッドを停止させるために、thread1.thread.interrupt()thread2.thread.interrupt() を呼び出してスレッドを終了させます。

public class KillThread {
  public static void main(String[] args) {
    ExampleThread thread1 = new ExampleThread("Thread One");
    ExampleThread thread2 = new ExampleThread("Thread Two");

    try {
      Thread.sleep(6);
      thread1.thread.interrupt();
      thread2.thread.interrupt();
      Thread.sleep(8);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    System.out.println("**Exiting the main Thread**");
  }
}

class ExampleThread implements Runnable {
  private String name;
  Thread thread;

  ExampleThread(String name) {
    this.name = name;

    thread = new Thread(this, name);
    System.out.println("Created Thread: " + thread);

    thread.start();
  }

  @Override
  public void run() {
    while (!thread.isInterrupted()) {
      System.out.println(name + " is running");
    }

    System.out.println(name + " has been Stopped.");
  }
}

出力:

Created Thread: Thread[Thread One,5,main]
Created Thread: Thread[Thread Two,5,main]
Thread One is running
Thread Two is running
Thread One has been Stopped.
Thread Two has been Stopped.
**Exiting the main Thread**
著者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

関連記事 - Java Thread