中断scala并行收集
有没有办法中断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内部不断旋转。看起来该方法会清除中断状态并一直等待生
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()
,并正确处理中断。