在下面的代码中,我按照预期在100秒后捕获TimeoutException.此时我希望代码退出main并终止程序,但它会继续打印到控制台.如何让任务在超时后停止执行?
private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool();
private static <T> T timedCall(Callable<T> c, long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
FutureTask<T> task = new FutureTask<T>(c);
THREAD_POOL.execute(task);
return task.get(timeout, timeUnit);
}
public static void main(String[] args) {
try {
int returnCode = timedCall(new Callable<Integer>() {
public Integer call() throws Exception {
for (int i=0; i < 1000000; i++) {
System.out.println(new java.util.Date());
Thread.sleep(1000);
}
return 0;
}
}, 100, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
Run Code Online (Sandbox Code Playgroud) 我对执行者服务很陌生.喜欢自己做所有事情,但我认为是时候相信这些服务了.
我想交Executer一个Runnable.执行者FutureTask把它包裹起来并交给我.现在我调用poll done()方法.但是我希望在done()方法返回true 时得到通知.
有一种get()方法可以阻塞直到Runnable完成,但是我需要为每个作业添加一个额外的线程,只是为了看它何时完成.
我可以给我的执行者一些额外的工作,Callable以获得有关完成任务的通知吗?
怎么去这里?我可以在run方法的末尾添加一些代码,但后来done()可能仍然是假的...
我需要找到一种从Future转换为ListenableFuture的方法.目前我正在使用一个返回Future的服务,但我需要连接一个监听器.我无法更改服务界面,因为它不属于我.
有一个简单的方法吗?
我已经阅读了番石榴文档,但我仍然找不到办法.
是否可以将Java FutureTask与Spring TaskExecutor 一起使用来获取Future对象?
我正在寻找一个实现Java ExecutorService接口的TaskExecutor,特别是submit()方法.浏览Spring Javadocs并没有透露任何类似这样的类.是否有一些替代方法通过Spring TaskExecutors处理未来,我不知道?
如果有可能,你还可以包括一个例子吗?
new Thread(new Runnable() {
public void run() {
.............
.............
.............
}
}).start();
Run Code Online (Sandbox Code Playgroud)
如果我将在main中执行此操作,它将创建一个新线程并将向其提交任务以进行异步计算.
如果您看到FutureTask 文档,它还会说:
可取消的异步计算.此类提供Future的基本实现,包括启动和取消计算的方法,查询计算是否完成的查询,以及检索计算结果.
那么它FutureTask是如何在asynchronous computation内部创建线程并提交我们在实例化时提供的任务,FutureTask如:
FutureTask f = new FutureTask(new MyCallable());
Run Code Online (Sandbox Code Playgroud)
否则它不能是异步计算,请提供FutureTask 源代码 中的代码片段,它将任务提交给线程,以使其进行异步计算.谢谢.
我得到了答案.它基本上是尝试在与调用者相同的线程中运行任务.在给定的代码中非常明显:
当你调用futureTask.run()它时只调用它sync.innerRun();并且sync是内部类的实例Sync.因为它只是call()在同一个线程中调用可调用对象.
void innerRun() {
if (!compareAndSetState(READY, RUNNING))
return;
runner = Thread.currentThread(); //here it is getting the current thread
if (getState() == RUNNING) {
V result;
try {
result = callable.call();//here calling call …Run Code Online (Sandbox Code Playgroud) 长话短说:我有一个Future对象的集合.其中一些已经在进行中,有些则没有.我迭代收集并调用future.cancel(false),根据文档,应该取消所有Future当前没有运行但应该允许所有其他人完成的.
我的问题是:Future在我打电话后,我怎么知道特定的什么时候完成future.cancel(false)?future.isDone()总是返回,true因为cancel()在此之前确实被调用,并且即使仍在运行,也future.get()总是抛出一个.CancellationExceptionFuture
有什么建议?
我希望从一个方法得到一个结果可能需要一段时间才能完成并且实际上不会返回该对象,所以我想尽可能有效地处理它.这是我想要实现的一个例子:
public static void main (String[] args) {
Object obj = someMethod();
System.out.println("The object is" + obj + ", wooh!");
}
public void callObject() {
// Sends request for the object
}
public void receiveObject(Object object) {
// Received the object
}
public Object someMethod() {
callObject();
// delay whilst the object is being received
// return received object once received, but how?
}
Run Code Online (Sandbox Code Playgroud)
方法callObject将调用获取对象,但是在对象中调用另一个方法.我希望someMethod()能够调用该对象,然后返回它最终收到的内容,即使实际调用和接收是单独的方法.
我已经研究过使用FutureTasks和Callables,我认为这是前进的方向,我只是不太确定如何实现它.
对不起,如果我没有解释得太好,我会在必要时提供更多信息.
谢谢!
我有这样的服务:
class DemoService {
Result process(Input in) {
filter1(in);
if (filter2(in)) return...
filter3(in);
filter4(in);
filter5(in);
return ...
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想要它更快,我发现一些过滤器可以同时启动,而一些过滤器必须等待其他过滤器完成.例如:
filter1--
|---filter3--
filter2-- |---filter5
---filter4--
Run Code Online (Sandbox Code Playgroud)
意思是:
1.filter1和filter2可以同时启动,filter3和filter4也是如此
2.filter3和filter4必须等待filter2完成
还有一件事:
如果filter2返回true,则'process'方法立即返回并忽略以下过滤器.
现在我的解决方案是使用FutureTask:
// do filter's work at FutureTask
for (Filter filter : filters) {
FutureTask<RiskResult> futureTask = new FutureTask<RiskResult>(new CallableFilter(filter, context));
executorService.execute(futureTask);
}
//when all FutureTask are submitted, wait for result
for(Filter filter : filters) {
if (filter.isReturnNeeded()) {
FutureTask<RiskResult> futureTask = context.getTask(filter.getId());
riskResult = futureTask.get();
if (canReturn(filter, riskResult)) { …Run Code Online (Sandbox Code Playgroud) 我在我的并发编程课程中学习期货.我的教授在她的幻灯片中说明了这一点:
"Valid" futures are future objects associated to a
shared state, and are constructed by calling one of the following functions:
async
promise::get_future
packaged_task::get_future
Run Code Online (Sandbox Code Playgroud)
future对象仅在它们有效时才有用.默认构造的未来对象无效(除非移动分配有效的未来).
我无法理解上述的含义,尤其是"除非移动指定有效的未来"部分.有人可以用简单的术语解释一下,也许还会展示一些示例代码吗?
我想知道android FutureTask和AsyncTaskandroid 之间的区别.根据我的想法,我们可以在FutureTask中获得当前的情况.使用ExecutorService我们可以创建一个并行进程池.我们可以使用AsyncTask实现相同的属性.我想知道在哪里使用AsyncTask以及何时使用FutureTask的情况.
我在这里问过一个问题 ,但没有得到任何答复.现在我想我应该改变我获取webservices数据的方式.所以我认为我应该使用FutureTask因为它们具有像isDone()这样的功能
并取消.请一些人指导我从网络服务中检索数据的更好方法.因为我的textView设置适配器太慢了.
或者我只需要一种方法来取消正在运行的AsyncTasks或用当前替换它.当用户按下w它呼吁的AsyncTask,当他在AutotextView添加任何词来它会三次要求waka之一wa,并wak和一个waka.当用户按下另一个文本时,是否可以取消正在运行的任务.有关详情,请参阅我的问题.
futuretask ×10
java ×8
concurrency ×3
future ×3
asynchronous ×2
callable ×2
android ×1
c++ ×1
guava ×1
runnable ×1
spring ×1
threadpool ×1
validation ×1