【问题标题】:Testing a threaded program测试线程程序
【发布时间】:2012-11-12 05:18:29
【问题描述】:

我已经为Readers-Writers problem 开发了一个使用线程的解决方案。

我有一个监视器类、一个 Reader 和一个 Writer 类。Reader 和 writer 类扩展线程。

现在我正在测试这样的代码:

public static void main(String[] args) {

  ReadersWriters controller = new ReadersWriters();
  Reader r0=new Reader(controller);
  Reader r1=new Reader(controller);
  Reader r2=new Reader(controller);
  Reader r3=new Reader(controller);
  Writer w0=new Writer(controller);
  Writer w1=new Writer(controller);
  Writer w2=new Writer(controller);
  Writer w3=new Writer(controller);
  r0.run();
  w0.run();
  r2.run();
  r3.run();
  r1.run();
  r3.run();
  r2.run();
  w2.run();
  r1.run();
  w1.run();
  w3.run();
 }

我得到的输出是这样的:

Reader number 0 arrives
Reader number 0 starts to read
Reader number 0 finishes reading
Writer number 0 arrives
Writer number 0 starts to write
Writer number 0 finishes writing
Reader number 2 arrives
Reader number 2 starts to read
Reader number 2 finishes reading

...等等。 这里的问题是我无法测试并发性。因为看起来我的主程序正在一个接一个地调用 Reader 或 writer,这不是我想要实现的测试。

任何人都可以帮助我。请随时询问您可能需要的任何澄清。

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    看起来您已经实现了Runnable,但没有将其包装在线程中。我怀疑你在Runnable 上调用run(),而不是在线程上调用start()。查看defining/starting a thread上的教程部分。

    您无法在单元测试等中可靠地测试多线程代码。它可以工作一次或多次,并且在一百万个测试用例中仅失败一次(或立即在生产中)。我更喜欢线程安全的编码技术(例如编写不可变对象)、静态代码分析工具(例如 PMD),如果您不确定,我可能还喜欢 code reviews

    【讨论】:

      【解决方案2】:

      您应该实现Runnable 接口并使用ThreadPoolExecutor 来运行/控制线程,而不是扩展Thread 和调用Thread.run()

      【讨论】:

        【解决方案3】:

        您应该使用 start 方法调用(调用)线程运行方法。 public void run() 应使用 thread.start() 调用。

        r0.run();
        

        应该是

        r0.start();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-29
          • 2019-01-01
          • 2011-07-29
          • 2013-07-04
          相关资源
          最近更新 更多