জাভাতে বর্তমানে চলমান সমস্ত থ্রেডের একটি তালিকা পান


232

কোনো উপায় আছে আমি বর্তমান জেভিএম (থ্রেড সহ চলমান সমস্ত থ্রেডের একটি তালিকা পেতে পারেন না আমার ক্লাসের শুরু)?

তালিকার মধ্যে সমস্ত থ্রেডের Threadএবং Classঅবজেক্টগুলি পাওয়াও কি সম্ভব ?

আমি কোডের মাধ্যমে এটি করতে সক্ষম হতে চাই।

উত্তর:


325

একটি পুনরাবৃত্তযোগ্য সেট পেতে:

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();

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

29
@ এডি হ'ল এটি কি সাধারণ জ্ঞান থেকে অনুমান, না আপনি পরীক্ষা-নিরীক্ষা করেছেন? আপনি বলেছেন "উল্লেখযোগ্যভাবে ধীর"; কত ধীর? এটা কি মূল্য? আমি দক্ষতার জন্য কোডকে আরও খারাপ করার যে কোনও প্রয়াসকে প্রশ্ন করি। যদি পরিমাণের তুলনায় দক্ষতার পরিমাপ করার জন্য আপনার যদি দক্ষতার প্রয়োজনীয়তা এবং একটি অবকাঠামো থাকে তবে আমি কোড খারাপ করার লোকদের সাথে ঠিক আছি, কারণ তারা মনে করছেন তারা কী করছেন। ডোনাল্ড নুথ অনুসারে সমস্ত অশুভের মূল দেখুন ।
thejoshwolfe

20
আমি এই নির্দিষ্ট বিকল্পগুলি সময়সই করিনি, তবে আমি কেবল থ্রেডগুলির একটি তালিকা বনাম স্ট্যাকের চিহ্নগুলি সংগ্রহ করার জন্য অন্যান্য জাভা পদ্ধতির সাথে কাজ করেছি। পারফরম্যান্সের প্রভাবটি আপনি যে জেভিএম ব্যবহার করছেন তার উপর খুব দৃ strongly়তার সাথে নির্ভর করে বলে মনে হচ্ছে (উদাহরণস্বরূপ জে রোকিট বনাম সান জেভিএম)। এটি আপনার নির্দিষ্ট উদাহরণে পরিমাপযোগ্য। এটি আপনাকে প্রভাবিত করবে কিনা তা আপনার জেভিএম পছন্দ এবং আপনার কতগুলি থ্রেডের উপর নির্ভর করে। আমি দেখতে পেলাম যে থ্রেডএমএক্সবিয়ান.ডম্পএলথ্রেডসের মাধ্যমে সমস্ত 250 স্ট্রেডের মাধ্যমে প্রায় 250 থ্রেডের জন্য 150 - 200 মেসি নিতে হবে যখন কেবল থ্রেডের তালিকা পাওয়া যায় (ট্রেস ছাড়াই) পরিমাপযোগ্য না হয় (0 মেসি)।
এডি

4
আমার সিস্টেমে (ওরাকল জাভা 1.7 ভিএম), একটি দ্রুত চেক দেখায় যে নীচের বিকল্পের চেয়ে এই পদ্ধতিটি ~ 70..80 গুন বেশি। স্ট্যাক ট্রেস এবং প্রতিবিম্ব সবচেয়ে ভারী জাভা ক্রিয়াকলাপের অন্তর্গত।
ফ্রাঞ্জ ডি।

5
@ তেজোশওয়াল্ফ: অবশ্যই পাঠযোগ্যতা একটি গুরুত্বপূর্ণ বিষয়, এবং কারও পক্ষে মাইক্রো-অপ্টিমাইজ করা উচিত নয়। তবে, আমি একটি ছোট অ্যাপ্লিকেশন পারফরম্যান্স মনিটর লেখার সময় আমার গবেষণাটি করেছি। এই ধরণের সরঞ্জামের জন্য, নির্ভরযোগ্য ডেটা পাওয়ার জন্য ন্যূনতম পারফরম্যান্সের ছাপটি অপরিহার্য, তাই আমি স্ট্যাকট্রেস-কম পদ্ধতিটি বেছে নিয়েছি।
ফ্রানজ ডি

75

রুটের কাছে একটি হ্যান্ডেল পান ThreadGroup:

ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
    rootGroup = parentGroup;
}

এখন, enumerate()রুট গ্রুপে ফাংশনটি বারবার কল করুন । দ্বিতীয় যুক্তি আপনাকে পুনরাবৃত্তভাবে সমস্ত থ্রেড পেতে দেয়:

Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
    threads = new Thread[threads.length * 2];
}

অ্যারে সমস্ত এন্ট্রি ধারণের পর্যাপ্ত পরিমাণে বড় না হওয়া পর্যন্ত আমরা কীভাবে বারবার গণনা () কল করব তা নোট করুন।


22
আমি অবাক হয়েছি যে এই কৌশলটি ইন্টারনেটে এত জনপ্রিয়। আমার কৌশলটি উপায় সহজ (কোডের 1 লাইন) এবং জাতি শর্ত এড়ানোর যুক্ত বোনাসের সাথে ঠিক একইভাবে কাজ করে।
thejoshwolfe

11
@ তেজোশওয়াল্ফ: আসলে, আমি সম্মত - আমি মনে করি আপনার উত্তরটি আরও ভাল, এবং এটি সম্ভবত এক বছর আগে দেরী না করলে প্রথমদিকে গ্রহণযোগ্য উত্তর হত। যদি ওপি এখনও এসও-কে অনুরোধ করে, যা তিনি স্পষ্টতই করেন, তবে তিনি আমার উত্তরটি স্বীকার না করার পরিবর্তে আপনার উত্তর গ্রহণ করার পরামর্শ দিয়েছিলেন।
ফ্রেরিচ রাবাবে

2
নোট করুন যে বাদে অন্য যে কোনও কিছুর জন্য rootGroupআপনার ব্যবহার করা উচিত new Thread[rootGroup.activeCount()+1]activeCount()শূন্য হতে পারে এবং যদি এটি হয় তবে আপনি অসীম লুপে চলে যাবেন।
jmiserez

7
@ তেজোশওয়াল্ফ আমার ধারণা এই সমাধানটি খুব কম ব্যয়বহুল।
হাওজুন

19
এই আন্ডাররেটেড উত্তরের জন্য +1, কারণ এটি আইএমএইচও পর্যবেক্ষণের জন্য বেশি উপযুক্ত। এর সহজাত জাতিগত পরিস্থিতি পর্যবেক্ষণে খুব বেশি কিছু আসে না। তবে কিছু তাত্ক্ষণিক পরীক্ষা হিসাবে দেখা গেছে, এটি স্ট্যাকট্র্যাস-ভিত্তিক সমাধানের চেয়ে প্রায় 70-80 গুণ বেশি দ্রুত faster পর্যবেক্ষণের জন্য, একটি ছোট পারফরম্যান্স ইমপ্রিন্ট অপরিহার্য, আপনি যতটা সম্ভব নিরীক্ষণ করা সিস্টেমে প্রভাবগুলি রাখতে চান (হাইজেনবার্গ আবার আঘাত করে :) ডিবাগিংয়ের জন্য, যেখানে আপনার আরও নির্ভরযোগ্য তথ্যের প্রয়োজন হতে পারে, স্ট্যাকট্রেস পদ্ধতি হতে পারে অপরিহার্য। বিটিডাব্লু, এমএক্সবিয়ান দ্রবণ স্ট্যাকট্রেসগুলি ব্যবহার করার চেয়েও ধীর।
ফ্রান্সজ ডি

29

হ্যাঁ, থ্রেডগুলির তালিকা পাওয়ার জন্য একবার দেখুন । এই পৃষ্ঠায় প্রচুর উদাহরণ।

এটি প্রোগ্রামগতভাবে এটি করা। আপনি যদি লিনাক্সের জন্য কেবলমাত্র একটি তালিকা চান তবে আপনি কেবল এই আদেশটি ব্যবহার করতে পারেন:

kill -3 processid

এবং ভিএম স্টাডাউটের জন্য একটি থ্রেড ডাম্প করবে।


5
মেরুন -৩? অন্তত আমার লিনাক্সের উপর, এটি "টার্মিনাল প্রস্থান"। খুন, তালিকা দেয় না।
মাইকেল এইচ।

5
ক্লিটাসটি সত্যই সঠিক - একটি কিল -৩ সিগন্যালটির অর্থ কী তা বিবেচনা ব্যতীত স্টাডটে ডাম্প করবে। আমি পরিবর্তে jstack ব্যবহার বিবেচনা করব।
ড্যান হার্ডিকার

থ্রেডের তালিকা পেয়ে পৌঁছানো যায় না: nadeausoftware.com সংযোগ করতে অস্বীকার করেছে।
DSlomer64

18

থ্রেড এমএক্সবিয়ান থেকে আপনি থ্রেড সম্পর্কে প্রচুর তথ্য পেতে পারেন ।

এমবিয়ানের রেফারেন্স পেতে স্ট্যাটিক ম্যানেজমেন্টফ্যাক্ট্রি.গ্যাটথ্রেড এমএক্সবিয়ান () পদ্ধতিতে কল করুন ।


14

আপনি jconsole এ একবার দেখেছেন ?

এটি একটি নির্দিষ্ট জাভা প্রক্রিয়াতে চলমান সমস্ত থ্রেডের তালিকা তৈরি করবে।

আপনি JDK বিন ফোল্ডার থেকে jconsole শুরু করতে পারেন।

Ctrl+Breakউইন্ডোতে আঘাত করে বা kill pid --QUITলিনাক্স প্রেরণ করে আপনি সমস্ত থ্রেডের জন্য একটি সম্পূর্ণ স্ট্যাক ট্রেস পেতে পারেন ।


আমি আমার জাভা ক্লাসের মধ্যে তালিকাটি অ্যাক্সেস করতে চাই
ক্রিটেন

এক্ষেত্রে ক্লিটাসের উত্তর দেখুন।
পিজেপি

3
ওম, লোকেরা কেন এই প্রোগ্রামিং সমাধান চাইছে বলে লোকেরা কেন এটিকে ভোট দিচ্ছে?
ক্লিটাস

কারণ প্রশ্নটি তা উল্লেখ করে না। আমি এটিকে স্পষ্ট করতে প্রশ্নটি সম্পাদনা করব।
pjp

8

অ্যাপাচি কমন্স ব্যবহারকারীরা ব্যবহার করতে পারেন ThreadUtils। বর্তমান প্রয়োগটি আগে বর্ণিত থ্রেড গ্রুপ পদ্ধতির ওয়াকটি ব্যবহার করে।

for (Thread t : ThreadUtils.getAllThreads()) {
      System.out.println(t.getName() + ", " + t.isDaemon());
}

7

আপনি এরকম কিছু চেষ্টা করতে পারেন:

Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "\nIs Daemon " + t.isDaemon() + "\nIs Alive " + t.isAlive()));

এবং আপনার প্রয়োজন হলে আপনি স্পষ্টতই আরও থ্রেড বৈশিষ্ট্য পেতে পারেন।


5

ইন খাঁজকাটা আপনি ব্যক্তিগত পদ্ধতি কল করতে পারেন

// Get a snapshot of the list of all threads 
Thread[] threads = Thread.getThreads()

ইন জাভা , আপনার দেওয়া সুরক্ষা পরিচালক এটা করতে পারবেন যে পদ্ধতি ব্যবহার করে প্রতিফলন ডাকা পারবেন না।


আমি ত্রুটি পেয়েছি, getThreads থ্রেড জন্য সংজ্ঞায়িত করা হয় না। এবং আমি ডকুমেন্টেশনে এই ফাংশন দেখতে চাই না।

4

মূল থ্রেড দ্বারা সূচিত থ্রেডগুলির তালিকা পেতে কোড স্নিপেট:

import java.util.Set;

public class ThreadSet {
    public static void main(String args[]) throws Exception{
        Thread.currentThread().setName("ThreadSet");
        for ( int i=0; i< 3; i++){
            Thread t = new Thread(new MyThread());
            t.setName("MyThread:"+i);
            t.start();
        }
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for ( Thread t : threadSet){
            if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){
                System.out.println("Thread :"+t+":"+"state:"+t.getState());
            }
        }
    }
}

class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(5000);
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

আউটপুট:

Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE

আপনার যদি সিস্টেম থ্রেড সহ সমস্ত থ্রেডগুলির দরকার হয় যা আপনার প্রোগ্রাম দ্বারা শুরু করা হয়নি, নীচের শর্তটি সরিয়ে দিন।

if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())

এখন আউটপুট:

Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[Reference Handler,10,system]:state:WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[Finalizer,8,system]:state:WAITING
Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE
Thread :Thread[Attach Listener,5,system]:state:RUNNABLE

3
    public static void main(String[] args) {


        // Walk up all the way to the root thread group
        ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
        ThreadGroup parent;
        while ((parent = rootGroup.getParent()) != null) {
            rootGroup = parent;
        }

        listThreads(rootGroup, "");
    }


    // List all threads and recursively list all subgroup
    public static void listThreads(ThreadGroup group, String indent) {
        System.out.println(indent + "Group[" + group.getName() + 
                ":" + group.getClass()+"]");
        int nt = group.activeCount();
        Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
        nt = group.enumerate(threads, false);

        // List every thread in the group
        for (int i=0; i<nt; i++) {
            Thread t = threads[i];
            System.out.println(indent + "  Thread[" + t.getName() 
                    + ":" + t.getClass() + "]");
        }

        // Recursively list all subgroups
        int ng = group.activeGroupCount();
        ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
        ng = group.enumerate(groups, false);

        for (int i=0; i<ng; i++) {
            listThreads(groups[i], indent + "  ");
        }
    }

3

জাভা কনসোলে, Ctrl-Break টিপুন । এটি সমস্ত থ্রেড এবং হিপ সম্পর্কে কিছু তথ্য তালিকাভুক্ত করবে। এটি আপনাকে অবশ্যই অবজেক্টগুলিতে অ্যাক্সেস দেবে না। তবে এটি যে কোনও উপায়ে ডিবাগ করার জন্য খুব সহায়ক হতে পারে।


1

টার্মিনালটি ব্যবহার করে থ্রেড এবং তাদের সম্পূর্ণ রাজ্যের তালিকা পেতে, আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:

jstack -l <PID>

কোন পিআইডি হ'ল আপনার কম্পিউটারে প্রসেসের আইডি। আপনার জাভা প্রক্রিয়াটির প্রসেস আইডি পেতে আপনি jpsকমান্ডটি চালাতে পারবেন ।

এছাড়াও, আপনি আপনার থ্রেড ডাম্পকে বিশ্লেষণ করতে পারেন যা টিডিএজে (থ্রেড ডাম্প অ্যানালাইজার) জাস্টাক দ্বারা উত্পাদিত হয়েছে যেমন স্ট্র্যাথথ্র্যাড বা থ্রেড বিশ্লেষক সরঞ্জামকে চিহ্নিত করে


0

5
কে আপনাকে জিজ্ঞাসা করেছে কেবল তা নয়, অন্য যে কেউ উত্তরটিতে হোঁচট খাচ্ছে তারও কার্যকর হওয়ার জন্য আপনার চারপাশের আরও প্রাসঙ্গিক উত্তর দেওয়া উচিত।
প্রীতেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.