是否有人知道一种机制可以捕获正在运行的线程的状态并将其序列化以便进一步恢复?
JVM有什么可用的吗?
pthreads怎么样?
我的主要目标是能够将正在运行的线程迁移到远程计算机。
答案 0 :(得分:8)
通过该线程的协作,您可以通过线程支持的任何机制来完成。没有该线程的合作,这是不可能的。如果该线程持有您的序列化代码需要的锁,会发生什么?
如果迁移当前正在使用某些内核资源(如管道)的正在运行的线程,会发生什么。你会迁移那个资源吗?
解决问题的正确方法可能是让线程支持迁移机制。你如何做到这一点取决于该线程正在做什么。如果你准确地解释了什么,你会得到更有可能帮助你解决实际问题的答案。
答案 1 :(得分:1)
这个问题的答案实际上取决于正在运行的线程的状态。
如果状态是本地线程数据,它允许复制并保存线程状态然后插回到新线程中,那么该机制基本上只是用某种可序列化对象保存状态,然后是用于创建具有已保存状态的新线程,然后开始运行。
但是,如果线程状态依赖于外部对象或实体,则问题会更加严峻。例如,如果你有一个使用TCP作为服务器的线程,并且你想保存它的状态然后稍后重新启动它,套接字将会改变,访问服务器线程的客户端将知道服务器线程停止通信一段时间。
这意味着对于任何依赖于线程的外部实体,需要知道线程正在被保存和冻结,他们需要有一些东西允许它们转移到替代或保存和冻结自己,并且需要某种协议,以便重新启动的线程可以让其他实体知道它已经恢复业务及其当前状态。
此外,如果线程依赖于某些外部实体,那么这些实体必须能够处理被冻结的线程。可能需要某种机制,以便线程可以释放其状态被保存的各种资源,然后在重新启动时,能够回收那些资源或类似资源,然后将这些资源重置为已保存状态。
答案 2 :(得分:0)
如果要将正在运行的JVM从一台计算机移动到另一台计算机,您很可能不会自己动手,而是使用VM管理器的live migration功能。
VM管理器将整个虚拟机从一台物理机器移动到另一台物理机器而不停止虚拟机或进程,但它比序列化/反序列化线程要高一些。由于线程可能使用操作系统本地的资源(如文件系统或套接字),因此整个操作系统需要跟随该线程到另一台物理机。
答案 3 :(得分:0)
我不知道你能发送任何线程的方式本身。但是,您可以使用诸如memento模式之类的模式来保存线程的状态。
在继续之前请参阅这些参考资料,以便您了解术语:
基本上,你有这个:
ThreadLocal
变量来存储线程状态。这是一种比实际迁移线程,状态,堆栈等更好的方法,因为您可以选择绝对需要移动的内容而不是移动所有内容。