访问自定义线程方法

时间:2016-04-02 11:44:36

标签: java multithreading

我用额外的方法创建了一个自定义线程。我在循环中创建了几个线程。

我有兴趣知道我是否可以使用Thread.getAllStackTraces()执行额外的方法,如下所示。

public class CustomThread extends Thread
{

    int pid;

    CustomThread(int processID)
    {
        this.pid = processID;
    }

    @Override
    public void run() 
    {
        System.out.println("Thread running");
    }

    public void printDetails()
    {
        System.out.println("PID "+this.pid);
    }
}


public class Main 
{

   public static void main(String[] args) 
   {
       for(int i = 0;i<5;i++){
           CustomThread ct = new CustomThread(1);
           ct.start();
       }
   } 
   System.out.println(Thread.getAllStackTraces().get(0).printDetails); <- Is it possible to access the method like this?

}

2 个答案:

答案 0 :(得分:3)

  

Thread.getAllStackTraces()返回所有活动线程的堆栈跟踪映射。映射键是线程,每个映射值都是StackTraceElement数组,表示相应Thread的堆栈转储。

当返回Map<Thread, StackTraceElement[]>时,您无法使用get(0)获取元素。您必须提供Thread个实例作为密钥,但您将获得StackTraceElement[]
在你的情况下,你需要Thread.getAllStackTraces().keySet().get(0)来获得第一个线程,或者你可以迭代整个地图键

for (Thread t : Thread.getAllStackTraces().keySet()) {
   if (t instanceof CustomThread) {
       ((CustomThread)t).printDetails();;
   }
}

答案 1 :(得分:2)

打字时我发现Evgeny在打字速度方面打败了我,但是我想指出一些事情。他的方法是正确的,但不会给你任何输出:

首先是对方法的详细说明:

Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
Set<Thread> threads = map.keySet();//Get the keys of the map, in this case the key is the thread
for(Thread thread : threads){//iterate over all the threads
    if(thread instanceof CustomThread){//check to see if it is one of our custom threads
        CustomThread custom = (CustomThread)thread;//cast it to a custom thread
        custom.printDetails();//call your method
    }
}

这种方法还没有给你任何反馈(因为你的线程在运行时已经死了。)

@Override
public void run() {
    System.out.println("Thread running");
    while(true){}//add this to keep the thread alive
}

因此,为了测试它,你可以在Thread中添加一个无限的while循环,然后该方法将起作用。

此外,您的所有线程都将具有相同的PID,而不是使用i作为您使用1的循环中的PID。因此,要为您的所有自定义线程提供一个可以使用的不同PID:

for(int i = 0;i<5;i++){
  CustomThread ct = new CustomThread(i);
  ct.start();
}

我希望这会有所帮助:)

P.S。 Evgeny是第一个获得信用的信用。