0

我已经开发了一个使用线程来解决读者-作家问题的解决方案。

我有一个监视器类和一个 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,这不是我想要实现的那种测试。

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

4

3 回答 3

4

看起来您已经实现了一个Runnable,但没有将它包装在一个线程中。我怀疑你正在调用run()你的Runnable,而不是start()线程。查看有关定义/启动线程的教程部分。

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

于 2012-11-11T21:10:33.977 回答
1

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

r0.run();

应该

r0.start();
于 2012-11-11T21:10:35.013 回答
1

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

于 2012-11-11T21:11:38.240 回答