当前位置: 首页 > 知识库问答 >
问题:

有没有办法取消和重用ExecutorService?

海雪松
2023-03-14

我正在编写一个JavaFractal Explorer,分形计算是多线程完成的。以前,我只是创建了一堆线程(系统有多少处理器内核就有多少)并将它们保存在一个数组中,但这会导致一些问题,而且不是很优雅,现在我想切换到执行器。

我需要的功能是:

  • 用户可以随时选择要放大的分形图像的新区域,因此应该可以随时取消计算,并立即重新插入新任务

我的问题是Java ExecutorService(我使用Executors.newFixedThreadPool())在调用shutdownNow()后提交新任务时抛出异常(取消)。当然,我可以创建一个新的ExecutorService,但是所有的线程都必须重新创建,据我所知,这非常昂贵(这就是使用线程池的全部意义)。

所以基本上我需要的是一个ExecutorService实现,它使用一个线程池,可以在不关闭它的情况下取消它,这样它就可以被重用。

已经有这样的事了还是要我自己写?(不能太难吧?;))

我的当前代码位于https://github.com/lucaswerkmeister/JFractalizer.

提前感谢,

卢卡斯

PS:当使用executors时,我会将图像分割成比线程更多的部分,因此如果一部分完成得更快,那么线程不是空闲的,而是可以继续处理图像的另一部分。尽管如此,如果所有部分都是并行计算的,而不是一些部分比其他部分开始得晚,那将是很酷的,但这只是一个奖励。

共有2个答案

井疏珂
2023-03-14

您的任务应该能够处理中断。所以你可以通过打断他们来取消任务。

  boolean flag = Thread.interrupted();
  if(flag == true )
      throw new InterruptedException();
鲜于雨石
2023-03-14

您应该使用ExecutorService。html#shutdownNow()当您使用完ExecutorService,并且不打算向其提交新任务时。

如果要继续使用相同的ExecutorService,应取消各个任务。

方法<代码>ExecutorService。html#submit返回可用于取消执行和/或等待完成的未来。

 类似资料:
  • 我想在应用GROUPBY条件后取消对数据帧的分组。我一组一组地用熊猫 现在我想将数据解组。列名是由下划线连接的列的组合。例如:Amt\u 8\u red\u 17:列名是(Amount、Count、Color、Id)输出的样子 有没有更快的办法?

  • 我相信这三种类型的确认由于生产者属性仅限于领导者和生产者,我希望生产者在消费者通过kafka broker消费来自存储/队列的消息时收到具体的消息。还请纠正我,如果我在制作人的“acks”属性上有错误,它的默认值是“-1”,它确认所有副本是否已接收/存储消息,但它是否与消费者有关,或者我们是否可以在消费者提交且Kafka向制作人发送确认时创建一个桥梁?

  • 我有一个由多个类实现的接口,这些类也有一些额外的方法。如果我自动连接这个类。有没有办法自动安装这些额外的方法? 例如─ 界面 服务1 服务2 如果我尝试像这样直接自动连接服务- 然后我得到了类似这样的错误-

  • 我已经看到,这在其他类型的对话框窗口中是可能的,如“ShowConfirmDialog”,其中可以指定按钮的数量和它们的名称;但是在使用“ShowInputDialog”时是否可以实现相同的功能?我似乎在API中找不到这种类型的东西。也许我只是错过了,但任何帮助都很感激。

  • 问题内容: 我知道您可以通过执行 node.requestFocus(); 来将焦点集中在javafx中的一个节点上 。 但是有没有办法从javafx中的节点上夺走焦点或阻止对某个对象的焦点? 问题答案: 我不认为有任何保证将始终有效,但是您可以尝试将焦点设置为本质上不接受键盘输入的内容(例如布局窗格):

  • 我解释我这篇文章的目标。 实际上,我想重写如何Android工作的基本上,与应用程序中的字符串。此时此刻,我可以从重写android资源中动态更改它 实际上,我有这个功能,只有当我使用时才能正常工作: 有一种简单的方法,不需要太多代码,就可以覆盖xml中的行为?