您可以将一个getThread()方法添加到MyRunnable,该方法生成执行run()方法的Thread.
我建议像这样添加一个实例变量(必须是volatile以确保正确性):
private volatile Thread myThread;
在try块之前执行此操作:
myThread = Thread.currentThread();
并添加一个finally块:
myThread = null;
然后你可以打电话:
final Thread theThread = myRunnable.getThread();
if (theThread != null) {
System.out.println(theThread.getState());
}
对于一些MyRunnable.
null在这一点上是一个模棱两可的结果,意思是“没有运行”或“已经完成”.只需添加一个方法,告诉操作是否已完成:
public boolean isDone() {
return done;
}
当然,您需要一个实例变量来记录这种状态:
private volatile boolean done;
并在finally块中将其设置为true(可能在将线程设置为null之前,那里存在一些竞争条件,因为有两个值捕获一个事物的状态.特别是,使用这种方法,您可以观察到isDone() == true和getThread()!= null.您可以通过为状态转换设置锁定对象并在更改一个或两个状态变量时对其进行同步来缓解这种情况:
done = true;
请注意,仍然没有任何防护措施禁止单个MyRunnable同时提交给两个或多个线程.我知道你说你今天没有这样做……多个并发执行会导致状态损坏,可能性很高.您可以在run方法的开头放置一些互斥保护(例如在run()方法上简单地写同步),以确保在任何给定时间只发生一次执行.