Java でスレッドを強制終了する
Java のスレッドを使用すると、複数のタスクを並行して実行できるので、マルチタスクが可能になります。Java では Thread
クラスを使ってスレッドを作成することができます。この記事では、スレッドを終了させるための 2つのメソッドを紹介します。
スレッドはすべてのタスクを完了すると Thread
クラスの run()
メソッドによって破棄されますが、スレッドの実行が完全に終了する前にスレッドを kill したり停止したりしたい場合もあるでしょう。
Java で boolean
フラグを使用してスレッドを強制終了または停止する
スレッドを明示的に強制終了するには、タスクを停止するタイミングをスレッドに通知するブーリアンフラグを使用します。下の例では、2つのスレッドがそのスレッド名の行を表示し、その後、両方のスレッドが約 100 ミリ秒の間スリープします。スレッドは、ブール値フラグ exitThread
が真になるまで実行されます。
thread1
と thread2
は作成された 2つのスレッドであり、引数として名前が渡されています。クラス ExampleThread
のコンストラクタにはスレッドの実行を開始する thread.start()
があるので、両方のスレッドが実行されることになります。並列に実行されているため、出力には両方のスレッドの名前がランダムに表示されていることがわかります。
スレッドを停止させるには、ExampleThread
のメソッドである stopThread()
を呼び出して exitThread
を true
に設定し、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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn