জাভাতে, আপনি কীভাবে নির্ধারণ করবেন যে কোনও থ্রেড চলছে কিনা?


85

কোনও থ্রেড চলছে কিনা তা আপনি কীভাবে নির্ধারণ করবেন?

উত্তর:



33

আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

boolean isAlive()

থ্রেডটি মারা গেলে থ্রেডটি এখনও বেঁচে থাকলে এবং মিথ্যা হলে এটি সত্য হয়। এটি অচল নয়। থ্রেড ক্লাসের অবজেক্টের জন্য আপনার একটি রেফারেন্স দরকার।

আরও একটি টিপ: নতুন থ্রেড চলমান অবস্থায় মূল থ্রেডটি অপেক্ষা করার জন্য যদি আপনি এটির স্থিতি পরীক্ষা করে থাকেন তবে আপনি যোগদান () পদ্ধতিটি ব্যবহার করতে পারেন। এটি আরও কার্যকর।



9

কল করে থ্রেডের স্থিতি পরীক্ষা করুন Thread.isAlive


6

সম্পর্ন নিভূল হতে পারে,

Thread.isAlive() থ্রেড শুরু হয়ে থাকলে (এখনও চলমান নাও হতে পারে) তবে এটির চালানোর পদ্ধতিটি এখনও সম্পন্ন না করা হলে সত্যটি ফিরে আসে।

Thread.getState() থ্রেডের সঠিক অবস্থা প্রদান করে।


5

থ্রেড.স্টেট এনাম ক্লাস এবং নতুন গেটস্টেট () এপিআই একটি থ্রেডের প্রয়োগের স্থিতি অনুসন্ধানের জন্য সরবরাহ করা হয়েছে।

একটি থ্রেড নির্দিষ্ট সময়ে একটি মাত্র অবস্থায় থাকতে পারে। এই রাজ্যগুলি ভার্চুয়াল মেশিনের রাজ্য যা কোনও অপারেটিং সিস্টেম থ্রেডের রাজ্যগুলিকে প্রতিফলিত করে না [ NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED]।

enum Thread.State প্রসারিত Enum কার্যকরী Serializable , তুলনীয়

  • 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

আইস্লাইভ (), গেটস্টেট () পদ্ধতিগুলি প্রদর্শনের জন্য একটি কোড লেখার কথা ভেবেছিলেন , এই উদাহরণটি একটি থ্রেড পর্যবেক্ষণ করে এখনও এটি বন্ধ করে দেয় (মারা যায়)।

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();। এই থ্রেডটি যদি জীবিত থাকে তবে সত্য ফিরে আসে ; অন্যথায় মিথ্যা


এটি কি সবসময় সত্য ফিরে আসবে না? আমি মনে করি এটি অন্য থ্রেডের হ্যান্ডেল হতে হবে। সর্বোপরি, বর্তমান থ্রেডটি কি Thread.currentThread().isAlive()এভাবে কার্যকর হবে না সর্বদা সত্য?
ম্যাথু

1

থ্রেডটি জীবিত আছে কিনা তা দেখার জন্য থ্রেড.কন্ট্রেনথ্রেড () .এলাইভ () ব্যবহার করুন [আউটপুটটি সত্য হওয়া উচিত] যার অর্থ থ্রেড এখনও রান () পদ্ধতির অভ্যন্তরে কোড চালাচ্ছে বা পাওয়ার জন্য থ্রেড কোডারেন্টথ্রেড.গেট স্টেট () পদ্ধতিটি ব্যবহার করুন থ্রেডের সঠিক অবস্থা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.