diff --git a/oneflow/core/job/runtime.cpp b/oneflow/core/job/runtime.cpp
index ebf4512c0071e154e1d2f4a1bcb6a658b7b78443..49df84f26f42df79e92ccd3a5b8eda271f381a83 100644
--- a/oneflow/core/job/runtime.cpp
+++ b/oneflow/core/job/runtime.cpp
@@ -128,7 +128,8 @@ void Runtime::NewAllGlobal(const Plan& plan, size_t total_piece_num, bool is_exp
   Global<MemoryAllocator>::New();
   Global<RegstMgr>::New(plan);
   Global<ActorMsgBus>::New();
-  Global<ThreadMgr>::New(plan);
+  Global<ThreadMgr>::New();
+  Global<ThreadMgr>::Get()->AddPlan(plan);
   Global<boxing::collective::CollectiveBoxingDeviceCtxPoller>::New();
   Global<RuntimeJobDescs>::New(plan.job_confs().job_id2job_conf());
   Global<summary::EventsWriter>::New();
diff --git a/oneflow/core/thread/thread_manager.cpp b/oneflow/core/thread/thread_manager.cpp
index 62016ec753f15bf79fa0f2af1b840e997852aacd..e09db774378ff5b8f171bffda21d359d0691597f 100644
--- a/oneflow/core/thread/thread_manager.cpp
+++ b/oneflow/core/thread/thread_manager.cpp
@@ -42,7 +42,7 @@ Thread* ThreadMgr::GetThrd(int64_t thrd_id) {
   return iter->second.get();
 }
 
-ThreadMgr::ThreadMgr(const Plan& plan) {
+void ThreadMgr::AddPlan(const Plan& plan) {
   const int64_t this_rank = GlobalProcessCtx::Rank();
   for (const TaskProto& task : plan.task()) {
     TaskId task_id = DeserializeTaskIdFromInt64(task.task_id());
diff --git a/oneflow/core/thread/thread_manager.h b/oneflow/core/thread/thread_manager.h
index 86964a78f7bd8eaeb5e8420b97be145f64c7461c..36824ed8db393b39252ce2d5d4de9c6e63a7205f 100644
--- a/oneflow/core/thread/thread_manager.h
+++ b/oneflow/core/thread/thread_manager.h
@@ -29,14 +29,14 @@ class Plan;
 class ThreadMgr final {
  public:
   OF_DISALLOW_COPY_AND_MOVE(ThreadMgr);
-  ThreadMgr() = delete;
+  ThreadMgr() = default;
   ~ThreadMgr();
 
+  void AddPlan(const Plan& plan);
   Thread* GetThrd(int64_t thrd_id);
 
  private:
   friend class Global<ThreadMgr>;
-  explicit ThreadMgr(const Plan& plan);
 
   HashMap<int64_t, std::unique_ptr<Thread>> threads_;
 };