问题标签 [futuretask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
201 浏览

java - 要求 FutureTask 在取消之前启动

在我的 Callable 代码中,我使用信号将多个结束行为通知给另一个线程。Callable 对象在 Executor 中与 FutureTasks 一起排队。他们也可能在排队后被取消。

现在,我的问题是我依赖于至少正在启动的任务才能让我的信号正常工作,但是如果执行程序在有机会运行它之前被标记为已取消,它看起来只是跳过一个任务。

那么,有没有办法保证任务总是启动,并且在运行时总是被取消(通过 InterruptedException)。

另外,你能检查一个任务是否还没有开始但失败了?

0 投票
4 回答
7743 浏览

java - 如何确保对提交给 ThreadPoolExecutor 然后取消的 FutureTask 进行垃圾收集?

我正在向Callablea 提交对象ThreadPoolExecutor,它们似乎一直存在于内存中。

使用 Eclipse 的 MAT 工具查看堆转储,可以看到Callable对象被 aFutureTask$Sync可调用变量引用。这FutureTask$Sync是由 aFutureTask同步变量引用的。这FutureTask是由FutureTask$Syncthis$0变量引用的。

我已经阅读了有关此内容(herehere和 on SO)的信息,似乎FutureTask可调用对象包含在ThreadPoolExecutor的 submit() 中永远持有对可调用对象的引用。

我感到困惑的是如何确保FutureTask收集垃圾,以便它不会继续将可调用对象保存在内存中,并保存可调用对象可能保存在内存中的任何内容?

只是为了提供有关我的特定情况的更多详细信息,我正在尝试以ThreadPoolExecutor一种允许在需要时取消所有提交的任务的方式来实现。我尝试了在 SO 和其他地方找到的几种不同方法,例如完全关闭执行程序(使用shutdown()shutdownNow())并保留期货返回列表submit()并对所有它们调用取消,然后清除期货列表。理想情况下,我希望不必将其关闭,并cancel()在需要时将其清除。

所有这些方法似乎都没有什么不同。如果我向池提交一个可调用的,它很有可能最终会留下来。

我究竟做错了什么?

谢谢。

编辑:

根据要求,这里是 ThreadPoolExecutor 的构造函数。

经过进一步测试,我可以看到如果我让已经提交给 ThreadPoolExecutor 的任务完成,那么就没有泄漏。如果我尝试以任何方式取消它们,例如:

或者保存对未来的引用并稍后调用取消:

或者通过使用以下方法将它们从队列中删除:

或者

或循环保存对期货的引用并调用:

任何这些情况都会导致 FutureTask 如上所述停留。

因此,所有这一切的真正问题是如何正确取消或从 ThreadPoolExecutor 中删除项目,以便 FutureTask 被垃圾收集并且不会永远泄漏?

0 投票
6 回答
31700 浏览

java - Java中的Future和FutureTask有什么区别?

既然 use ExecutorServicecan submita Callabletask and return a Future,为什么需要 use FutureTaskto wrap Callabletask and use the methodexecute呢?我觉得他们都做同样的事情。

0 投票
5 回答
4241 浏览

java - 等待 FutureTask 上的 cancel()

我想取消从 ThreadPoolExecutor 获得的 FutureTask,但我想确保线程池上的 Callable 已停止它的工作。

如果我调用 FutureTask#cancel(false) 然后 get() (阻塞直到完成)我得到一个 CancelledException。这个异常是立即抛出还是在任务停止执行后抛出?

0 投票
2 回答
9885 浏览

java - TimerTask 和 Executors.newScheduledThreadPool(1) 的区别

我需要安排一些将来要完成的工作。我可以通过两种方式做到这一点:

  1. 创建TimerTask并执行timer.schedule(...);

  2. 使用Executors.newScheduledThreadPool(1)

    /li>

这两种安排未来工作的方式有什么区别?

0 投票
2 回答
5520 浏览

java - Android BluetoothSocket - 超时

我编写了一个蓝牙 API 用于连接外部附件。API 的设计方式是有一堆阻塞调用,例如getTime, setTime, getVolume,setVolume等。这些工作的方式是它们创建一个有效负载来发送和调用一个被调用的方法,该方法sendAndReceive()会做一些准备工作并最终完成下列的:

问题是有时这个设备会变得很慢或没有响应,所以我想在这个调用上设置一个超时。我尝试了几种方法将此代码放入线程\未来任务并超时运行,例如:

这种方法的问题是我不能在调用方法中重新抛出异常,并且由于某些方法抛出异常我想转发回 API 的客户端,所以我不能使用这种方法。

你能推荐一些其他的选择吗?谢谢!

0 投票
4 回答
7673 浏览

java - java Callable FutureTask Executer:如何监听已完成的任务

我对执行服务很陌生。喜欢自己做所有事情,但我认为是时候相信这些服务了。

我想Executer通过Runnable. 刽子手FutureTask把它包起来递给我。现在我调用 polldone()方法。但是我希望在 thendone()方法返回 true 时收到通知。

有一种get()方法会阻塞直到Runnable完成,但是我需要为每个作业添加一个额外的线程,以查看它何时完成。

我可以给我的执行者一些额外的东西Callable来获得关于任务完成的通知吗?

去这里的路是什么?我可以在方法的末尾添加一些代码run,但done()可能仍然是错误的......

0 投票
2 回答
1782 浏览

java - 发生异常时挂起的未来任务异步调用

我在我的 java 程序中编写了许多异步未来任务调用。下面给出一个样本

现在假设我在上面的第二个调用中故意创建了一个异常,并将所有 3 个调用 get() 包含在一个 try/catch 块中,我没有看到异常进入 catch 块,我的 java 程序只是静止不动。所有 3 个方法调用同时发生。

但是,如果我将每个 get() 包含在单独的 try catch 块中,我就可以捕获它们。为什么?此外,当我开始将每个 get() 方法包含在 try catch 块中时,我失去了多线程。方法调用按照编码一一发生

当我能够捕获异常时,我会丢失多线程,当我能够生成多线程时,我会丢失异常。

任何想法如何单独处理异常并同时实现多线程

0 投票
4 回答
4689 浏览

java - 如何进入 FutureTask 执行状态?

我有一个singleThreadExecutor,以便按顺序执行我提交给它的任务,即一个接一个的任务,没有并行执行。

我有 runnable 是这样的

}

例如,当我将 MyRunnable 的三个实例提交给上述单线程执行器时,我希望第一个任务正在执行,并且由于 Thread.sleep 在 TIMED_WAITING 中有其执行线程(我可能对具体的错误状态)。其他两个任务不应该分配线程来执行它们,至少在第一个任务完成之前是这样。

所以我的问题是如何通过 FutureTask API 获得这种状态,或者以某种方式到达正在执行任务的线程(如果没有这样的线程,那么任务正在等待执行或挂起)并获得它的状态,或者可能通过一些其他手段?

FutureTask 只定义了 isCanceled() 和 isDone() 方法,但不足以描述 Task 的所有可能执行状态。

0 投票
3 回答
3049 浏览

java - 未来任务取消()

基本上我有以下片段,

问题是偶尔取消不起作用,AFAICT 取消导致并引发异常,但是下面的一些代码捕获了它?有没有确定的方法可以取消未来的任务?

fn 是一个基本上执行一系列长时间运行计算的函数,因此我无法循环检查布尔标志。