这是我的自定义线程类
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。怎么可能?
答案 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,不是吗?