在Java中,如何确定线程是否正在运行?

时间:2009-05-14 02:57:44

标签: java multithreading

如何确定线程是否正在运行?

10 个答案:

答案 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扩展了枚举实现SerializableComparable

  • getState() jdk5 - public State getState() {...} « 返回{的状态{1}}线程。此方法旨在用于监视系统状态,而不是用于同步控制。

  • isAlive() - this « 如果调用它的线程,则返回 true 仍然活着,否则返回 false 。如果一个线程已经启动并且尚未死亡,则该线程处于活动状态。

java.lang.Threadsun.misc.VM的示例源代码。

public final native boolean isAlive();

Examplepackage 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()方法获取线程的确切状态