0

我有许多线程对对象执行不同的操作,当将近 50% 的任务完成时,我想序列化所有内容(可能是我想关闭我的机器)。

当我回来时,我想从我离开的地方开始。我们怎样才能达到?

这就像在玩游戏时保存任何游戏对象的状态。通常我们保存对象的状态并取回。但是在这里我们存储它的进程的计数/状态。

例如:

我有一个线程正在为 50,000 名员工创建薪水 Excel 表。

其他线程正在为相同的 50,000 名员工创建评估信。

另一个主题是给 50,000 名员工写“新年快乐”电子邮件。

所以想象一下多个操作。

现在我想在 50% 的任务完成之间关闭。比如说已经写了25-30000个员工工资excel-sheet,并完成了25-30000的评估信等等。当我第二天回来时,我想从我离开的地方开始这个过程。

这就像简历

4

4 回答 4

2

我不确定这是否有帮助,但如果线程通过内存队列进行通信,您可以实现这一点。

要序列化整个应用程序,您需要做的是禁用队列的消耗,当所有线程都空闲时,您将到达可以序列化整个状态的“安全点”。您需要跟踪您生成的所有线程,以了解它们是否处于空闲状态。

您也许可以使用另一种技术(可能是 java 代理?)来执行此操作,该技术会冻结 JVM 并允许您转储整个状态,但我不知道这是否存在。

于 2013-03-13T11:31:36.647 回答
1

好吧,它与保存对象状态没有太大区别。只需为不同类型的输入维护单独的队列。并在每次启动(第一次启动或重新启动)时检查这些队列,如果不是空的,则通过启动新进程但保留剩余数据来恢复“停止的进程”。

比如说前。一个应用程序正在发送消息,你退出该应用程序,剩余 10 个消息。有一个全局队列,应用程序的 senderMethod 将在每次启动时检查它。所以在这种情况下它将有 10msg 在等待队列中,所以它将继续发送剩余的 msgs。

编辑: 基本上,对于所有可恢复的过程'说pr1,pr2 ....prN,维护输入队列,比如q1,q2 ... qN。queue 应该删除已处理的元素,以仅包含待处理的输入。一旦你暂停系统。存储这些队列,并在重新启动时恢复它们。有一个通用的例程,说 resumeOperation,它将调用所有可恢复的进程(pr1,pr2....prN)。因此它将触发具有非 0 队列的方法的执行。在 tern 中复制恢复行为。

于 2013-03-13T11:31:24.723 回答
0

Java 提供java.io.Serializable接口来指示类中的序列化支持。

您没有提供有关该任务的太多信息,因此很难给出答案。

考虑任务的一种方法是根据可以分成几个步骤的通用算法。这些步骤中的每一个都是任务本身,因此您应该在此处看到一个模式。

通过将每个算法切成小块,直到您无法进一步划分,您可以很好地了解您的任务可以在以后中断和恢复的位置。任务的结果可以是:

  • 成功:任务返回预期类型的​​值

  • 失败:不知何故,在进行计算时某些事情没有转好

  • 中断计算:工作未完成,但可能稍后恢复,返回值是任务的状态

(请注意,后一种情况可能被视为失败的子情况,您可以根据自己的需要组织协议)。

根据您生成中断事件的方式(它是从主线程传递到工作线程的消息吗?会是异常吗?),该事件必须在任务树中冒泡,并触发每个任务以评估是否它的工作可以恢复也可以不恢复,然后将其自身的序列化版本提供给包含它的更大任务。

于 2013-03-13T11:43:38.810 回答
0

我不认为序列化是解决这个问题的正确方法。您想要的是持久队列,您可以在处理项目后将其删除。每次启动程序时,您只需从头开始处理队列。实现持久队列的方法有很多种,但考虑到您的操作规模,您首先想到的是数据库。

于 2013-03-14T23:18:59.573 回答