我用额外的方法创建了一个自定义线程。我在循环中创建了几个线程。
我有兴趣知道我是否可以使用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?
}
答案 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是第一个获得信用的信用。