如何进入FutureTask执行状态?
我有一个singleThreadExecutor以便以串行顺序执行提交给它的任务,即一个任务接一个,没有并行执行。
我有可运行的东西,像这样
MyRunnable implements Runnable {@Override
public void run() {
try {
Thread.sleep(30000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
例如,当我向上述单线程执行器提交MyRunnable的三个实例时,我希望执行第一个任务,并且由于Thread.sleep在TIMED_WAITING中具有其执行线程(我可能对特定的线程有误州)。其他两个任务不应分配有执行它们的线程,至少直到第一个任务完成时才分配线程。
所以我的问题是如何通过FutureTask
API来获得此状态,或者以某种方式到达正在执行任务的线程(如果没有这样的线程,则该任务正在等待执行或挂起)并获得其状态,或者通过某种方式其他手段?
FutureTask仅定义isCanceled()和isDone()方法,但这些方法不足以描述Task的所有可能的执行状态。
回答:
您可以添加一个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()
方法上),以确保在任何给定时间仅发生一次执行。
以上是 如何进入FutureTask执行状态? 的全部内容, 来源链接: utcz.com/qa/408466.html