问题标签 [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.
java - 使用 java.util.concurrent.FutureTask 是不是一个好方法?
首先,我必须说我对 API java.util.concurrent 很陌生,所以也许我正在做的事情是完全错误的。
我想做什么?
我有一个 Java 应用程序,它基本上运行 2 个单独的处理(称为myFirstProcess、mySecondProcess),但这些处理必须同时运行。
所以,我试着这样做:
myFirstProcess和mySecondProcess是实现 的类,Callable<Object>
它们的所有处理都在 call() 方法中进行。
它工作得很好,但我不确定这是否是正确的方法。是做我想做的事的好方法吗?如果没有,您能否给我一些提示来增强我的代码(并且仍然尽可能简单)。
java - 您可以将 Future/Futuretask 对象与 Spring TaskExecutors 一起使用吗?
是否可以将 Java FutureTask与 Spring TaskExecutor 一起使用来获取Future对象?
我正在寻找一个实现Java ExecutorService接口的TaskExecutor,特别是submit() 方法。查看Spring Javadocs并没有发现任何这样的类。是否有一些我不知道的通过 Spring TaskExecutors 处理期货的替代方法?
如果可能的话,您能否举个例子?
java - 在 Java ScheduledExecutorService 和 FutureTask 上寻求清晰
我刚刚开始研究 Java 中的 Futures 和 ScheduledExecutorService,我想知道为什么我的 Callable 没有按我指定的时间表运行。在此示例代码中,可调用对象运行一次,但应用程序永远不会完成,任务也不会再次运行,这是我预期会发生的(我确定问题出在我的预期中)。
Runnables 工作正常;可调用对象似乎永远阻塞,但我不知道为什么......我错过了什么?
谢谢!
java - Java 5:java.util.concurrent.FutureTask - cancel() 和 done() 的语义
我目前正在使用 FutureTasks 和 Executors 在多线程环境中寻找一个讨厌的错误。基本思想是让固定数量的线程执行单独的 FutureTasks,计算结果将显示在一张表中(不要介意这里的 GUI 方面)。
看了这么久,开始怀疑自己的智商了。
考虑这段代码:
当done()
由处理 MyTask 实例的 Executor 调用时,我检查我是否到达那里,因为任务已被取消。如果是这样,我会跳过所有剩余的活动,尤其是我不调用sendMessage()
.
FutureTask.done() 的文档说:
当此任务转换到状态 isDone 时调用受保护的方法(无论是正常还是通过取消)。默认实现什么也不做。子类可以覆盖此方法以调用完成回调或执行簿记。请注意,您可以在此方法的执行中查询状态以确定此任务是否已被取消。(API 参考)
但是我没有从文档中得到的是执行时FutureTask
的语义。如果我一开始就通过了检查,但之后其他线程调用了我的方法怎么办?这会导致我的任务改变主意并从那时起回复吗? done()
isCancelled()
cancel()
isCancelled() == true
如果是这样,我以后怎么知道消息是否已发送?看着isDone()
只会告诉我任务的执行已经完成,但当时isCancelled()
也是如此,我不知道它是否能及时发送消息。
也许这很明显,但我现在还没有真正看到。
java - 如何让 FutureTask 在 TimeoutException 之后返回?
在下面的代码中,我按预期在 100 秒后捕获了 TimeoutException。在这一点上,我希望代码从 main 退出并且程序终止,但它会继续打印到控制台。如何让任务在超时后停止执行?
java - FutureTasks 和 CachedThreadPool 是如何工作的
我目前有执行以下操作的代码:
我遇到的问题是我让每个未来的任务打印出他们在计算时所花费的时间,所以例如在控制台上我会看到
但是总时间System.out.println(time taken)
(
我的印象是这些未来的任务是并行运行的,但从时间上看,它们似乎是一个接一个地运行。我是否正确使用了这个 API?
java - ScheduledExecutorService.scheduleAtFixedRate 并将 initialDelay 设置为过去的日期
我正在开发一个 Java 调度系统,它根据startDate、endDate和发生(每小时、每天、每周、每月、星期一等)发送提醒。最初我使用Timer和TimerTask类来安排提醒:
我最近切换到ScheduledExecutorService,这样我可以更好地控制取消事件。ScheduledExecutorService在重复提醒方面效果很好,除了在过去重新安排带有startDate的提醒的一种情况。scheduleAtFixedRate函数只允许您为initialDelay指定long值,而不是实际的Date对象:
这带来了一个问题,因为传入负的initialDelay仍然会导致事件立即被触发,从而导致它在now + period再次发生,而不是startDate + period。
有什么想法可以(重新)安排过去startDate的提醒吗?
java - 如何使用 ThreadPoolExecutor 和自定义任务实现 PriorityBlockingQueue
我搜索了很多,但找不到解决我的问题的方法。
我有自己的班级,BaseTask
使用 aThreadPoolExecutor
来处理任务。我想要任务优先级,但是当我尝试使用 a 时,PriorityBlockingQueue
我得到ClassCastException
了因为ThreadPoolExecutor
它将我的任务包装到一个FutureTask
对象中。
这显然是有道理的,因为FutureTask
没有实现Comparable
,但是我将如何继续解决优先级问题?我读过你可以覆盖newTaskFor()
in ThreadPoolExecutor
,但我似乎根本找不到这种方法......?
我们欢迎所有的建议!
一些帮助的代码:
在我的BaseTask
课上,我有
在BaseFutureTask
课堂上
在BaseThreadPoolExecutor
类中,我覆盖了 3 个submit
方法......这个类中的构造函数被调用,但没有一个submit
方法
java - 如何在 FutureTask 中捕获异常
在发现在 Java 1.6(以及来自 Eclipse)中FutureTask
运行会吞下方法中的异常后,我试图想出一种方法来捕获这些异常,而无需在我的所有实现中添加 throw/catch。Executors.newCachedThreadPool()
Runnable.run()
Runnable
API 建议重写FutureTask.setException()
应该对此有所帮助:
导致此 Future 报告一个 ExecutionException,并将给定的 throwable 作为其原因,除非此 Future 已被设置或已被取消。此方法在计算失败时由 run 方法在内部调用。
然而,这个方法似乎没有被调用(使用调试器运行显示异常被 捕获FutureTask
,但setException
没有被调用)。我编写了以下程序来重现我的问题:
我的主要问题是:如何捕获 FutureTask 中抛出的异常?为什么不setException
叫?
另外我想知道为什么Thread.UncaughtExceptionHandler
不使用该机制FutureTask
,有什么原因吗?
java - 发生了一件有趣的事情...... ExecutorCompletionService
我有一个用 java 编写的应用程序,它需要找到网络上所有可访问的主机。
我用InetAddress.isReachable()
2000 毫秒的超时来执行此操作。
我查找当前本地机器的 IP 地址,并据此尝试访问以 1-255 结尾的其他 IP 地址,而丢失了本地机器的 IP 地址。
这一切都工作正常单线程,只是需要很长时间,因为大多数 IP 地址不存在,因为它们不存在,所以用完 2 秒超时。
为了加快速度(并在行动中尝试并发性 :: Brian Goetz),我尝试使用Future
等Callable
。
这一切也很顺利。
但是我想用ExecutorCompletionService
它来给我的用户一个响应速度更快的应用程序,这样他们就可以看到结果,因为他们可以使用
在具有以下配置的单处理器机器上运行此程序会导致四个可访问主机中的一个被识别:
在四核机器上将其更改为这样也使其无法检测到所有可访问的主机:
通过将InetAddress.isReachable()
超时更改为 10 秒,使最后一个配置正常工作。
此外,通过在四核机器上按如下方式更改配置,也使其在 2 秒超时下工作:
我是否遗漏了一些非常明显的东西,为什么会发生这种情况?
是什么阻止InetAddress.isReachable(2000)
了检测我网络上所有可访问的主机?
为什么尝试运行多个InetAddress.isReachable()
调用会失败?