测试线程程序

时间:2012-11-11 21:07:54

标签: java multithreading concurrency

我使用线程为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或者编写器,这不是我想要实现的那种测试。

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

r0.run();

应该是

r0.start();

答案 2 :(得分:1)

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