我將從Thread類的可能狀態開始。有6種可能的狀態:
Enum Thread.State
新:還沒有開始就處於這種狀態的線程。
RUNNABLE:在Java虛擬機中執行的線程處於此 狀態。
BLOCKED:阻塞等待顯示器鎖定的線程處於 此狀態。
WAITING:等待無限期地等待另一個線程執行特定動作的線程處於此狀態。
TIMED_WAITING:正在等待另一個線程執行的線程 對於達到指定等待時間的操作處於此狀態。
TERMINATED:退出的線程處於此狀態。
正如你所說的那樣「已被殺死」的線程是處於終止狀態的線程。有兩個主要原因會導致終止狀態。
- A)run()方法在他的工作後正常退出。
- B)發生異常,run()方法結束。
如果你想讓你的線程「永不」進入終止模式,那麼你應該A)有一個無限循環B)捕獲所有異常。但那不完全是你的問題。如何監視線程的狀態?
主要是getState()方法
公共Thread.State的getState()
返回該線程的狀態。此方法設計用於監視系統狀態,而不是用於同步控制。
你可以做你想做的有以下3類:
App.java
package com.what.ever;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class App {
private static int MONITORING_FREQUENCY = 5;
private static int NUMBER_OF_TASKS = 3;
public static void main(String[] args) {
List<ThreadMonitor> threadMonitors = initThreadMonitors();
threadMonitors.forEach(m -> m.printState());
threadMonitors.forEach(m -> m.startThread());
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> threadMonitors.forEach(m -> m.restartIfTerminated()), MONITORING_FREQUENCY, MONITORING_FREQUENCY, TimeUnit.SECONDS);
}
private static List<ThreadMonitor> initThreadMonitors() {
List<ThreadMonitor> threadMonitors = new ArrayList<>();
for (int i = 1; i <= NUMBER_OF_TASKS; i++) {
DummyRunnable runnable = new DummyRunnable(i);
ThreadMonitor threadMonitor = new ThreadMonitor(runnable);
threadMonitors.add(threadMonitor);
}
return threadMonitors;
}
}
ThreadMonitor.java
package com.what.ever;
public class ThreadMonitor {
private Thread thread;
private DummyRunnable runnable;
public ThreadMonitor(DummyRunnable runnable) {
this.runnable = runnable;
this.thread = new Thread(runnable);
}
public boolean startThread() {
boolean isStarCalled = false;
if(Thread.State.NEW.equals(thread.getState())) {
thread.start();
isStarCalled = true;
}
return isStarCalled;
}
public void printState() {
System.out.println(thread.toString() + " is in state : " + thread.getState());
}
public void restartIfTerminated() {
printState();
if(Thread.State.TERMINATED.equals(thread.getState())) {
thread = new Thread(runnable);
thread.start();
}
}
}
DummyRunnable.java
package com.what.ever;
public class DummyRunnable implements Runnable {
private int id;
public DummyRunnable(int id) {
this.id = id;
}
public void run() {
System.out.println("Runnable " + id + " started in thread: " + Thread.currentThread());
dummyWork();
System.out.println("Runnable " + id + " done");
}
private void dummyWork() {
int sleep = 10000;
if (id == 3) {
sleep = 1000;
}
try {
Thread.sleep(sleep);
} catch (Exception e) {
System.out.print(e);
}
}
}
在這裏,你去。如果您對這個例子有任何疑問,只需詢問。
小警告: 小心監控頻率,會對性能產生巨大影響。不要試圖用這個做實時應用。
如何確保線程不停止? '嘗試'''catch'拋出的任何'Exception'。 –
本文使用自定義偵聽器在線程停止時得到通知:http://www.algosome.com/articles/knowing-when-threads-stop.html – Berger
@Andy Turner Java代碼異常是線程可以停止的唯一方法嗎?我們可以監視線程並檢查它們中的任何一個是否存在於主類中? – user3608212