问题标签 [future]
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 - 并发 - 中断 Future 而不取消它
有没有办法在不取消 Future 的情况下中断它?
boolean cancel (boolean mayInterruptIfRunning)
尝试取消此任务的执行。如果任务已完成、已被取消或由于某些其他原因无法取消,则此尝试将失败。如果成功,并且在调用取消时此任务尚未启动,则此任务不应该运行。如果任务已经开始,则 mayInterruptIfRunning 参数确定是否应该中断执行该任务的线程以尝试停止该任务。
要捕获中断,我们必须正确捕获 Interrupted Exception 或检查 Runnable / Callable 方法中的 isInterrupted() 方法。
但是没有办法使用 Future 接口中断正在运行的 Future
由于所有线程都在 Executor Service 池中,没有人可以做 thread.interrupt()。这就是为什么假设只有当 Future 被取消或线程池终止时才会出现任何中断?
我试图理解为什么 Future 接口中没有中断方法。任何帮助将不胜感激
java - 通过 Future 实现线程
我想知道以下是否是正确的实现
根据Javadoc,future.get()
等待每个线程的执行完成,这(据我了解)意味着对于未来的每一个,我们将分别等待接收结果。那时的好处来自哪里,或者我做得不对?
c++ - 用 std::launch::sync 模拟 std::async?
我想实现这样的方法:
我知道boost::promise
and boost::packaged_task
,set_wait_callback
但是,由于返回的未来引用了这将不起作用?
我知道有std::async
and std::launch::sync
,但是如何使用 boost 和 vs2010 来模拟它?
sql-server - NHibernate:加载整个图(collection of collection)
我需要(出于一个真正充分的理由,相信我)使用 NHibernate 加载我的数据库的几乎整个图表。实体不多,但图表有点复杂。
我的图表看起来像:
- 实体A
- |
- --> 实体B
- |
- --> 列表
- |
- --> 实体D
- |
- --> 列表
- |
- --> 实体F
反正你懂这个意思。
我想用尽可能少的查询和往返来加载所有这些,并且可能根本没有选择 N+1。此外,我想将其保留为图表,以便以后可以轻松地循环浏览它。
我最好的选择是什么?NHibernateUtil.Initialize()?Fetch()/FetchMany()?未来/多查询?
我有点迷茫,但我想我必须在多个操作中这样做。但是最有效的方法是什么?
还有好处:所有实体都有一个 IsPublished 属性。我希望能够加载所有实体或仅加载已发布的实体。
编辑
最后我尝试了这个:
考虑到我的图表的外观,我认为这还不错。此外,我在同一级别上没有多个集合,据我所知,这就是导致笛卡尔积的原因。
对于那些询问的人,这不是递归问题。否则我将使用 SQL Server CTE。我也没有更新任何实体;它只是简单的阅读(对于离线应用程序)。
但我对我的“奖金”问题一无所知。我知道 EF 可以根据过滤器加载部分集合,但 NH 似乎不可能。
c++ - 是否有现有的方法来序列化 boost::signals2 信号的调用?
我想序列化 boost::signals2 信号的多线程调用,以确保有关来自对象的状态更改的通知以明确定义的顺序到达插槽。
背景
我在多线程程序中有一个具有内部状态的对象。内部状态的某些部分对程序的其他部分来说是有趣的,并且对象通过使用 boost::signals2 信号公开状态更改,类似于:
问题
如果有多个 OnEvent 处理程序的并发调用,这可能会导致侦听器以不同于实际发生更改的顺序收到有关状态更改的通知。状态本身由上面的互斥锁保护,因此实际状态是明确定义的。但是,互斥锁不能在对信号的调用中保持,因为这可能导致死锁。这意味着信号的实际调用可能以任何顺序发生,而我会要求它们以与实际发生状态更改的顺序相同的顺序被调用。
处理此问题的一种方法是从信号中删除状态,并仅通知侦听器状态已更改。然后,他们可以查询对象的状态,并获取对象在信号触发时的状态或以后的状态。在我的场景中,需要通知侦听器所有状态更改,因此此方法在这里不起作用。
我的下一个方法如下:
我没有尝试过上面的代码,所以它可能充满了错误和编译错误,但应该可以推断出我所追求的。我的直觉告诉我,我不是第一个遇到此类问题的人,我更喜欢使用经过验证的代码而不是我自己的... :) 所以我的问题是:
是否有一种预先存在的方法来实现对 boost::signals2 信号的序列化调用(例如内置到 signals2 库或通用模式中)?
java - 为什么 Clojure 将已检查异常与未检查异常包装在一起?
下面的代码演示了一个被检查的异常 ,ExecutionException
被一个操作抛出并且 Clojure 用 包裹它的例子RuntimeException
。
Clojure 为什么要这样做?这是正常的吗?在这种情况下,Clojure 似乎在做一些与 Java 不同的事情。Exception
在这种情况下,处理导致失败的实际异常的惯用方法是什么?
java - future.get 的行为与 0 超时
任何人都可以向我指出一些明确说明超时为 0 的“Future.get”不会等待的文档吗?
API 文档java.util.concurrent.Future
没有明确说明future.get(0, unit)
. 就其本身而言,声明“如果需要,最多等待给定时间......”意味着这个调用根本不会等待,但考虑到(无限等待)的长期行为Object.wait(0)
,我很紧张依赖的“不等待”行为future.get(0, unit)
扫描一些 JDK 提供的类的源代码(即。FutureTask
)我看到这个特定的实现Future
在超时为 0 时不会等待。
我想能够说
但是我对 Future 将其实现为无限等待感到紧张,因此,我已经按照我期望它的工作方式明确地对其进行了编码:
c++ - “扁平化”嵌套期货
我有一个辅助函数,我用它来将嵌套的期货“展平”成一个单一的期货:
编辑:按照建议将“折叠”重命名为“展平”。
我正在使用来自 boost 库的期货:
它是这样使用的:
问题是,这仅在我将“嵌套”未来转换为shared_future
. 有什么好办法绕过它吗?我想要的是这样的:
其次,我有点不确定该方法的名称。有什么意见吗?
c++ - boost::future - wait_callback 是否保证只被调用一次?
如果我在 aset_wait_callback
上设置 a boost::unique_future
,是否保证只运行一次?
我有点怀疑,因为在查看源代码时,我发现以下内容:
在调用回调时,互斥锁在哪里实际解锁,据我了解,如果多个线程调用该函数do_callback
,这可能导致回调被多次调用?wait
可以多次调用回调吗?是设计使然吗?还是我错过了什么?
我有点惊讶的原因是,在 C++11 标准中async(std::launch::deferred, ...)
(它set_wait_callback
是表亲),似乎有单一调用保证:
§30.6.8
在函数完成之前,共享状态不会准备好。 在引用此共享状态的异步返回对象上首次调用非定时等待函数 (30.6.4)应调用调用等待函数的线程中的延迟函数。