जावा में, आप कैसे निर्धारित करते हैं कि एक धागा चल रहा है?


84

यदि कोई थ्रेड चल रहा है तो आप कैसे निर्धारित करते हैं?

जवाबों:


93

Thread.isAlive()


मुझे लगता है कि इसमें कुछ अंतर है Thread.State.RUNNABLE(पिछले एक अधिक विश्वसनीय लगता है)
user924

33

आप इस विधि का उपयोग कर सकते हैं:

boolean isAlive()

यह सच है अगर धागा अभी भी जीवित है और झूठे हैं अगर धागा मर चुका है। यह स्थिर नहीं है। आपको थ्रेड वर्ग की वस्तु के संदर्भ की आवश्यकता है।

एक और टिप: यदि आप जाँच कर रहे हैं कि मुख्य सूत्र प्रतीक्षा करने की स्थिति है जबकि नया धागा अभी भी चल रहा है, तो आप जॉइन () विधि का उपयोग कर सकते हैं। यह अधिक उपयोगी है।



9

कॉल करके थ्रेड स्थिति की जाँच करें Thread.isAlive


6

सटीक होना,

Thread.isAlive() सही है अगर धागा शुरू किया गया है (अभी तक नहीं चल सकता है) लेकिन अभी तक अपनी रन विधि को पूरा नहीं किया है।

Thread.getState() धागे की सटीक स्थिति देता है।


5

Thread.State enum class और नया getState () API एक थ्रेड की निष्पादन स्थिति को क्वेरी करने के लिए प्रदान किया जाता है।

एक धागा किसी दिए गए बिंदु पर केवल एक राज्य में हो सकता है। ये राज्य वर्चुअल मशीन राज्य हैं जो किसी भी ऑपरेटिंग सिस्टम थ्रेड स्टेट्स को प्रतिबिंबित नहीं करते हैं [ NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED]।

Enum Thread.State , Enum को Serializable , Comparable लागू करता है

  • getState ()jdk5 - public State getState() {...} « थ्रेड की स्थिति देता है this। यह विधि सिस्टम स्थिति की निगरानी में उपयोग के लिए डिज़ाइन की गई है, सिंक्रनाइज़ेशन नियंत्रण के लिए नहीं।

  • IsAlive () - public final native boolean isAlive(); « रिटर्न सच अगर धागा जिस पर यह कहा जाता है अभी भी जीवित है, अन्यथा यह रिटर्न झूठी । एक धागा जीवित है अगर इसे शुरू किया गया है और अभी तक मर नहीं गया है।

नमूना स्रोत कोड की कक्षाएं java.lang.Threadऔर sun.misc.VM

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समानांतर कई धागे निष्पादित करने के लिए, सभी धागे को पूरा करने के बाद मुख्य धागा निष्पादित करें। (जब तक समानांतर धागे अपने कार्य को पूरा नहीं करेंगे, मुख्य धागा अवरुद्ध हो जाएगा।)

public class MainThread_Wait_TillWorkerThreadsComplete {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Main Thread Started...");
        // countDown() should be called 4 time to make count 0. So, that await() will release the blocking threads.
        int latchGroupCount = 4;
        CountDownLatch latch = new CountDownLatch(latchGroupCount);
        new Thread(new Task(2, latch), "T1").start();
        new Thread(new Task(7, latch), "T2").start();
        new Thread(new Task(5, latch), "T3").start();
        new Thread(new Task(4, latch), "T4").start();

        //latch.countDown(); // Decrements the count of the latch group.

        // await() method block until the current count reaches to zero
        latch.await(); // block until latchGroupCount is 0
        System.out.println("Main Thread completed.");
    }
}
class Task extends Thread {
    CountDownLatch latch;
    int iterations = 10;
    public Task(int iterations, CountDownLatch latch) {
        this.iterations = iterations;
        this.latch = latch;
    }
    @Override
    public void run() {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " : Started Task...");
        for (int i = 0; i < iterations; i++) {
            System.out.println(threadName + " : "+ i);
            sleep(1);
        }
        System.out.println(threadName + " : Completed Task");
        latch.countDown(); // Decrements the count of the latch,
    }
    public void sleep(int sec) {
        try {
            Thread.sleep(1000 * sec);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@यह सभी देखें


A thread is alive if it has been started and has not yet died। क्या मतलब मर गया? राज्य है TERMINATED?
कुनलुन

2

जब यह समाप्त हो जाए तो अपने धागे को किसी अन्य धागे को सूचित करें। इस तरह आपको हमेशा पता चल जाएगा कि क्या चल रहा है।


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());
    }


}

1

आप उपयोग कर सकते हैं Thread.currentThread().isAlive();:। अगर यह धागा जीवित है तो सच लौटाता है ; गलत है अन्यथा।


1

Thread.currentThread ()। IsAlive () का उपयोग करें कि क्या थ्रेड जीवित है [आउटपुट सही होना चाहिए] देखने के लिए, जिसका अर्थ है कि थ्रेड अभी भी रन के अंदर कोड चला रहा है () विधि या थ्रेड.currentThread.getState () विधि का उपयोग करें धागे की सटीक स्थिति

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.