中断scala并行收集

中断scala并行收集,scala,fork-join,parallel-collections,Scala,Fork Join,Parallel Collections,有没有办法中断Scala中的并行集合计算 例如: val r=new Runnable{ 覆盖def run():单位={ (1到3)P.Frace{{= >线程。睡眠(5000000)} } } val t=新螺纹(r) t、 开始() Thread.sleep(300)//让它们旋转起来 t、 中断() 我希望t.interrupt能够中断par生成的所有线程,但这并没有发生,它在ForkJoinTask.externalwaitdone内部不断旋转。看起来该方法会清除中断状态并一直等待生

有没有办法中断Scala中的并行集合计算

例如:

val r=new Runnable{
覆盖def run():单位={
(1到3)P.Frace{{= >线程。睡眠(5000000)}
}
}
val t=新螺纹(r)
t、 开始()
Thread.sleep(300)//让它们旋转起来
t、 中断()
我希望
t.interrupt
能够中断
par
生成的所有线程,但这并没有发生,它在
ForkJoinTask.externalwaitdone
内部不断旋转。看起来该方法会清除中断状态并一直等待生成的线程完成


这是Scala 2.12

您使用的线程。
t.start()
只负责启动并行计算并等待并收集结果

它未连接到计算操作的线程。通常,它运行在与提交计算任务的线程无关的默认
forkJoinPool

如果要中断计算,可以使用自定义执行后端(如手动创建的
forkJoinPool
threadPool
),然后将其关闭。你可以读一下

或者,您可以从计算中提供回调

但所有这些方法都不适合这种情况

如果您正在制作一个生产解决方案,或者您的案例对于应用程序来说非常复杂和关键,那么您可能应该使用一些设计上具有取消功能的产品。例如
Monix.Task
cancelablefuture


或者至少使用
Future
并取消它。

您的
t.start()
线程只负责启动并行计算并等待并收集结果

它未连接到计算操作的线程。通常,它运行在与提交计算任务的线程无关的默认
forkJoinPool

如果要中断计算,可以使用自定义执行后端(如手动创建的
forkJoinPool
threadPool
),然后将其关闭。你可以读一下

或者,您可以从计算中提供回调

但所有这些方法都不适合这种情况

如果您正在制作一个生产解决方案,或者您的案例对于应用程序来说非常复杂和关键,那么您可能应该使用一些设计上具有取消功能的产品。例如
Monix.Task
cancelablefuture


或者至少使用
Future
并取消它。

我知道如何解决这个问题,有很多方法。但是从一开始就应该有很多实现行为的样板文件。我看不出
t.interrupt()
背后有任何逻辑。我会使用
ForkJoinTask.get()
,而不是
WrappedTask.sync
中的
.join()
,并正确处理中断。我知道如何解决这个问题,有很多方法。但是从一开始就应该有很多实现行为的样板文件。我看不出
t.interrupt()
背后有任何逻辑。我会使用
ForkJoinTask.get()
,而不是
WrappedTask.sync
中的
.join()
,并正确处理中断。