您可以添加一个
getThread()方法来
MyRunnable产生
Thread执行该
run()方法。
我建议添加一个这样的实例变量(必须可变以确保正确性):
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。通过
lock更改状态变量或在更改一个或两个状态变量时在其上进行同步来实现此目的):
done = true;
请注意,仍然没有任何保护措施可以禁止将一个事件
MyRunnable同时提交给两个或多个线程。我知道您说您今天不这样做…
:)多个并发执行极有可能导致损坏状态。您可以在run方法的开头放置一些互斥防护(例如,简单地写
synchronized在
run()方法上),以确保在任何给定时间仅发生一次执行。



