如何获取当前运行的自定义Threads变量

时间:2016-07-03 15:51:20

标签: java multithreading

这是我的自定义线程类

  public class ThreadEngine extends Thread{
  private int processid;
   public int getProcessid() {
      return processid;
    }
   public void setProcessid(int processid) {
    this.processid = processid;
    }
   public void run(){
    int count=0;
    for(Thread t:Thread.getAllStackTraces().keySet()){
        ThreadEngine t1=(ThreadEngine)t;
         int processtid=t1.getProcessid();
        if(t.getState()==Thread.State.RUNNABLE)count++;
     }
    }

 }

这里我试图将当前正在运行的线程强制转换为我的自定义线程类,但我得到了强制转换异常。

我想得到当前正在运行的线程的processid。怎么可能?

3 个答案:

答案 0 :(得分:1)

一些简单的方法来处理这个问题。 Full working code on online java ide

你想要达到什么目的? run()方法总是在线程中运行,例如实例是ThreadEngine。

因此,您只需在run()方法中使用getProcessid()即可访问进程ID。

在任何其他地方,如果你想访问当前的线程,你可以简单地使用 Thread.currentThread()返回当前线程。

如果您正在寻找任何线程而不是当前线程,那么您应该使用instanceof关键字确保它是否属于当前实例类型。

我已将工作代码附加在codiva java online compiler ide

答案 1 :(得分:1)

您假设JVM中存在的唯一线程是您已启动的线程。情况并非如此,因为以下代码段说明何时在ideone上运行:

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        for (Thread t : Thread.getAllStackTraces().keySet()) {
            System.out.println(t.getClass() + " " + t.getName());
        }
    }
}

输出:

class java.lang.ref.Finalizer$FinalizerThread Finalizer
class java.lang.Thread Signal Dispatcher
class java.lang.ref.Reference$ReferenceHandler Reference Handler
class java.lang.Thread main

尽管代码没有显式创建线程,但显示了4个线程。因此,如果你的代码 创建了线程,那么你应该期待一些额外的线程。

因此,您需要在转换之前检查您当前正在处理的线程是否是预期类的实例:

for(Thread t:Thread.getAllStackTraces().keySet()){
  if (t instanceof ThreadEngine) {
    ThreadEngine t1=(ThreadEngine)t;
    // ...
  }
}

这将忽略其他类型的线程。

答案 2 :(得分:0)

最简单的方法可能是创建ThreadEngine实例的主线程保留集合中每个实例的引用。只需遍历此集合即可调用getProcessid()。

但是:如果您只想计算正在运行的实例,则不需要processId,不是吗?