我有一些序列化的类,其中有几个成员是启动一些终身线程的类。(while(true){doSth();sleep(100)}
)。现在我想知道处理它们的好方法。我应该通过实现read / writeObject方法来创建这些对象,或者我应该划分工厂来创建这些对象并在不同的create方法中取出所有瞬态对象创建,并在我想从头开始创建它们时运行这两种工厂方法并使用只有我从序列化流中读取它们的情况的瞬态工厂方法?
答案 0 :(得分:3)
我应该通过实现read / writeObject方法来创建这些对象
首先,让你正在序列化的实体管理自己的线程是第一个红旗。序列化的实体很可能只是数据传递对象。业务逻辑和线程任务应该存在于其他地方。使用readObject()
方法神奇地分叉线程只会让我想到它的意志。
我会让阅读这些的类反序列化它们然后用某种实体/任务管理器注册它们。然后管理器将管理运行实体需要正确操作的任务的线程池(想象ExecutorService
)。实体,特别是序列化的实体,不应该自己做。
当我想从头创建它们时运行这两种工厂方法,并且只使用瞬态工厂方法来处理从序列化流中读取它们的情况?
如果您需要精确管理这些对象,那么您可以让实体经理进行实际构建和任务分叉。或者只是有一个register()
方法,所以每当有人构造一个或反序列化其中一个时,他们就会注册它。
答案 1 :(得分:0)
由于多种原因,这是一种糟糕的架构。具有while (true) { sleep }
结构的线程在该方面是一个大红旗,它们实际上是最好的做事方式是非常罕见的。
在这种情况下,使用带有线程池的ScheduledExecutorService
来处理所有任务,然后使用该服务注册对象。让对象自己注册时我会有点警惕(事实上,如果他们在构造函数中执行它,则从线程安全的角度来看它是主动断开的)。真的是工厂或经理班也应该处理它。