java – 如何获得FutureTask执行状态?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何获得FutureTask执行状态?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1867字,纯文字阅读大概需要3分钟。
内容图文
![java – 如何获得FutureTask执行状态?](/upload/InfoBanner/zyjiaocheng/826/74684e8779ab485cb0a753993898f332.jpg)
我有一个singleThreadExecutor,以执行我按顺序提交给它的任务,即一个接一个的任务,没有并行执行.
我有runnable,这是这样的
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,该方法生成执行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()方法上简单地写同步),以确保在任何给定时间只发生一次执行.
内容总结
以上是互联网集市为您收集整理的java – 如何获得FutureTask执行状态?全部内容,希望文章能够帮你解决java – 如何获得FutureTask执行状态?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。