উত্তর:
একটি পুনরাবৃত্তযোগ্য সেট পেতে:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
রুটের কাছে একটি হ্যান্ডেল পান 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];
}
অ্যারে সমস্ত এন্ট্রি ধারণের পর্যাপ্ত পরিমাণে বড় না হওয়া পর্যন্ত আমরা কীভাবে বারবার গণনা () কল করব তা নোট করুন।
rootGroup
আপনার ব্যবহার করা উচিত new Thread[rootGroup.activeCount()+1]
। activeCount()
শূন্য হতে পারে এবং যদি এটি হয় তবে আপনি অসীম লুপে চলে যাবেন।
হ্যাঁ, থ্রেডগুলির তালিকা পাওয়ার জন্য একবার দেখুন । এই পৃষ্ঠায় প্রচুর উদাহরণ।
এটি প্রোগ্রামগতভাবে এটি করা। আপনি যদি লিনাক্সের জন্য কেবলমাত্র একটি তালিকা চান তবে আপনি কেবল এই আদেশটি ব্যবহার করতে পারেন:
kill -3 processid
এবং ভিএম স্টাডাউটের জন্য একটি থ্রেড ডাম্প করবে।
থ্রেড এমএক্সবিয়ান থেকে আপনি থ্রেড সম্পর্কে প্রচুর তথ্য পেতে পারেন ।
এমবিয়ানের রেফারেন্স পেতে স্ট্যাটিক ম্যানেজমেন্টফ্যাক্ট্রি.গ্যাটথ্রেড এমএক্সবিয়ান () পদ্ধতিতে কল করুন ।
আপনি jconsole এ একবার দেখেছেন ?
এটি একটি নির্দিষ্ট জাভা প্রক্রিয়াতে চলমান সমস্ত থ্রেডের তালিকা তৈরি করবে।
আপনি JDK বিন ফোল্ডার থেকে jconsole শুরু করতে পারেন।
Ctrl+Break
উইন্ডোতে আঘাত করে বা kill pid --QUIT
লিনাক্স প্রেরণ করে আপনি সমস্ত থ্রেডের জন্য একটি সম্পূর্ণ স্ট্যাক ট্রেস পেতে পারেন ।
অ্যাপাচি কমন্স ব্যবহারকারীরা ব্যবহার করতে পারেন ThreadUtils
। বর্তমান প্রয়োগটি আগে বর্ণিত থ্রেড গ্রুপ পদ্ধতির ওয়াকটি ব্যবহার করে।
for (Thread t : ThreadUtils.getAllThreads()) {
System.out.println(t.getName() + ", " + t.isDaemon());
}
ইন খাঁজকাটা আপনি ব্যক্তিগত পদ্ধতি কল করতে পারেন
// Get a snapshot of the list of all threads
Thread[] threads = Thread.getThreads()
ইন জাভা , আপনার দেওয়া সুরক্ষা পরিচালক এটা করতে পারবেন যে পদ্ধতি ব্যবহার করে প্রতিফলন ডাকা পারবেন না।
মূল থ্রেড দ্বারা সূচিত থ্রেডগুলির তালিকা পেতে কোড স্নিপেট:
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
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 + " ");
}
}
টার্মিনালটি ব্যবহার করে থ্রেড এবং তাদের সম্পূর্ণ রাজ্যের তালিকা পেতে, আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:
jstack -l <PID>
কোন পিআইডি হ'ল আপনার কম্পিউটারে প্রসেসের আইডি। আপনার জাভা প্রক্রিয়াটির প্রসেস আইডি পেতে আপনি jps
কমান্ডটি চালাতে পারবেন ।
এছাড়াও, আপনি আপনার থ্রেড ডাম্পকে বিশ্লেষণ করতে পারেন যা টিডিএজে (থ্রেড ডাম্প অ্যানালাইজার) জাস্টাক দ্বারা উত্পাদিত হয়েছে যেমন স্ট্র্যাথথ্র্যাড বা থ্রেড বিশ্লেষক সরঞ্জামকে চিহ্নিত করে ।