代码之家  ›  专栏  ›  技术社区  ›  Raedwald

适用于非线程安全代码的执行器

  •  4
  • Raedwald  · 技术社区  · 7 年前

    我正在开发一些最终将使用线程池进行多线程处理的代码 Executor 只有那时 进行更改以确保螺纹安全(锁等)。为此,我需要一个 遗嘱执行人 与非线程安全代码一起使用是安全的。

    认为 那意味着我需要一个 遗嘱执行人 这是单线程的。也就是说,它使所有工作都由调用线程完成。JRE是否提供了这样一种服务 ? 或者可以配置一个 在那种模式下运行是什么意思?


    我已经在使用 Humble Object 测试模式来测试我的大部分代码单线程。但是,我的一些代码 必须 与一个 遗嘱执行人 ,或者是 ExecutorService ,因为它是 关于 scheduling 以及重新提交任务,它将以一种不平凡的方式这样做。测试 那个 代码是这里的挑战。这些任务更新一个共享对象,该对象保存它们的结果和输入数据。我想推迟使共享对象线程安全的时间,直到我实现并调试了调度和重新提交代码。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Karol Dowbecki    7 年前

    如果您计划首先开发单线程解决方案,而不是将业务逻辑从 Thread Callable 或 Runnable 你可以不用开始新的测试 Executor

        2
  •  1
  •   Raedwald    7 年前

    如果代码真的需要 只有 Executor ,而不是(更复杂) ExecutorService ,很容易实现自己的单线程执行器,它可以精确地执行所需的操作。API文档 遗嘱执行人 甚至向您展示了如何做到这一点:

    class DirectExecutor implements Executor {
       public void execute(Runnable r) {
         r.run();
       }
    }
    

    如果代码需要 执行者服务 信息技术 是可能的 提供的单线程执行器 Executors.newSingleThreadExecutor() 足以测试非线程安全代码, 尽管 执行者服务 ). 这是因为 执行者服务 必须提供以下内容 thread-safety guarantees :

    • 提交前线程中的操作 Runnable Callable 任务到 执行者服务 该任务所采取的任何行动,
    • 反过来 以前发生 Future.get() .

    因此,如果运行单元测试的线程执行 Future.get() 对于所有提交的任务,对任何共享对象的所有更改都将被安全地发布,运行单元测试的线程可以安全地检查这些共享对象。