处理序列化类中包含线程的临时成员的正确做法



我有一些序列化的类,它们有几个成员,这些成员是启动一些终身线程的类。(while(true){doSth();sleep(100)})。现在我想知道哪一种是处理它们的好方法。我是应该通过实现读/写对象方法来创建这些对象,还是应该划分创建这些对象的工厂,并在不同的创建方法中删除所有临时对象创建,并在我想从头开始创建它们时运行这两个工厂方法,并且在我从序列化流中读取它们的情况下只使用临时工厂方法?

我是否应该通过实现读/写对象方法来创建这些对象

首先,让正在序列化的实体管理自己的线程是第一个危险信号。序列化的实体很可能只是数据传递对象。业务逻辑和线程任务应该存在于其他地方。让readObject()方法神奇地分叉线程只会让我在思考它时感到不自在

我会让读取这些的类对它们进行反序列化,然后用某种实体/任务管理器注册它们。然后,管理器将管理线程池(想想ExecutorService),这些线程池运行实体适当操作所需的任务。实体,尤其是序列化的实体,不应该自己这样做。

当我想从头开始创建这两个工厂方法时,运行它们,并且在我从序列化流中读取它们的情况下只使用瞬态工厂方法?

如果你需要精确地管理这些对象,那么我想你可以让实体经理来进行实际的构建和任务分叉。或者只是有一个register()方法,所以每当有人构造一个或反序列化其中一个时,他们就会注册它

这是一个糟糕的体系结构,原因有很多。具有while (true) { sleep }结构的线程在这方面是一个巨大的危险信号,它们实际上是做某事的最佳方式,这是非常罕见的。

在这种情况下,使用带有线程池的ScheduledExecutorService来处理所有任务,然后向该服务注册对象。我会有点担心让对象自己注册(事实上,如果他们在构造函数中注册,从线程安全的角度来看,这是主动中断的)。实际上,工厂或经理类也应该处理这个问题。