如何确定线程是否正在运行?
答案 0 :(得分:80)
Thread.isAlive()
答案 1 :(得分:27)
您可以使用此方法:
boolean isAlive()
如果线程仍处于活动状态,则返回true;如果线程已死,则返回false。 这不是一成不变的。您需要引用Thread类的对象。
还有一个提示: 如果您正在检查它的状态以使主线程在新线程仍在运行时等待,则可以使用join()方法。它更方便。
答案 2 :(得分:17)
我认为你可以使用GetState();它可以返回线程的确切状态。
答案 3 :(得分:8)
通过调用Thread.isAlive
检查线程状态。
答案 4 :(得分:5)
准确地说,
如果线程已经启动(可能尚未运行)但尚未完成其运行方法, Thread.isAlive()
将返回true。
Thread.getState()
返回线程的确切状态。
答案 5 :(得分:4)
Thread.State 枚举类和新的 getState() API用于查询线程的执行状态。
线程在给定时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态 [NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
]。
枚举Thread.State扩展了枚举实现Serializable,Comparable
getState() jdk5
- public State getState() {...}
« 返回{的状态{1}}线程。此方法旨在用于监视系统状态,而不是用于同步控制。
isAlive() - this
« 如果调用它的线程,则返回 true 仍然活着,否则返回 false 。如果一个线程已经启动并且尚未死亡,则该线程处于活动状态。
类java.lang.Thread
和sun.misc.VM
的示例源代码。
public final native boolean isAlive();
Example与package java.lang;
public class Thread implements Runnable {
public final native boolean isAlive();
// Java thread status value zero corresponds to state "NEW" - 'not yet started'.
private volatile int threadStatus = 0;
public enum State {
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;
}
public State getState() {
return sun.misc.VM.toThreadState(threadStatus);
}
}
package sun.misc;
public class VM {
// ...
public static Thread.State toThreadState(int threadStatus) {
if ((threadStatus & JVMTI_THREAD_STATE_RUNNABLE) != 0) {
return Thread.State.RUNNABLE;
} else if ((threadStatus & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) {
return Thread.State.BLOCKED;
} else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) {
return Thread.State.WAITING;
} else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) {
return Thread.State.TIMED_WAITING;
} else if ((threadStatus & JVMTI_THREAD_STATE_TERMINATED) != 0) {
return Thread.State.TERMINATED;
} else if ((threadStatus & JVMTI_THREAD_STATE_ALIVE) == 0) {
return Thread.State.NEW;
} else {
return Thread.State.RUNNABLE;
}
}
}
并行执行多个线程,完成所有线程后主线程执行。 (直到并行线程完成其任务主线程将被阻止。)
java.util.concurrent.CountDownLatch
@See也
答案 6 :(得分:2)
让你的线程在完成后通知其他线程。通过这种方式,您将始终确切知道发生了什么。
答案 7 :(得分:1)
考虑编写一个代码来演示 isAlive(),getState() 方法,这个例子监视一个线程仍然它终止(死)。
package Threads;
import java.util.concurrent.TimeUnit;
public class ThreadRunning {
static class MyRunnable implements Runnable {
private void method1() {
for(int i=0;i<3;i++){
try{
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedException ex){}
method2();
}
System.out.println("Existing Method1");
}
private void method2() {
for(int i=0;i<2;i++){
try{
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedException ex){}
method3();
}
System.out.println("Existing Method2");
}
private void method3() {
for(int i=0;i<1;i++){
try{
TimeUnit.SECONDS.sleep(1);
}catch(InterruptedException ex){}
}
System.out.println("Existing Method3");
}
public void run(){
method1();
}
}
public static void main(String[] args) {
MyRunnable runMe=new MyRunnable();
Thread aThread=new Thread(runMe,"Thread A");
aThread.start();
monitorThread(aThread);
}
public static void monitorThread(Thread monitorMe) {
while(monitorMe.isAlive())
{
try{
StackTraceElement[] threadStacktrace=monitorMe.getStackTrace();
System.out.println(monitorMe.getName() +" is Alive and it's state ="+monitorMe.getState()+" || Execution is in method : ("+threadStacktrace[0].getClassName()+"::"+threadStacktrace[0].getMethodName()+") @line"+threadStacktrace[0].getLineNumber());
TimeUnit.MILLISECONDS.sleep(700);
}catch(Exception ex){}
/* since threadStacktrace may be empty upon reference since Thread A may be terminated after the monitorMe.getStackTrace(); call*/
}
System.out.println(monitorMe.getName()+" is dead and its state ="+monitorMe.getState());
}
}
答案 8 :(得分:1)
您可以使用:Thread.currentThread().isAlive();
。如果该线程处于活动状态,则返回 true ;否则,返回false。否则为 false 。
答案 9 :(得分:1)
使用 Thread.currentThread()。isAlive()来查看线程是否处于活动状态 [输出应为true],这意味着线程仍在内部运行代码。 run()方法或使用 Thread.currentThread.getState()方法获取线程的确切状态。