我使用线程为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或者编写器,这不是我想要实现的那种测试。
任何人都可以帮助我。请随时询问您可能需要的任何澄清。
答案 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
。