Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试线程程序_Java_Multithreading_Concurrency - Fatal编程技术网

Java 测试线程程序

Java 测试线程程序,java,multithreading,concurrency,Java,Multithreading,Concurrency,我已经开发了一个使用线程的解决方案 我有一个monitor类、一个Reader类和一个Writer类。Reader和Writer类扩展线程 现在,我正在这样测试代码: public static void main(String[] args) { ReadersWriters controller = new ReadersWriters(); Reader r0=new Reader(controller); Reader r1=new Reader(controller);

我已经开发了一个使用线程的解决方案

我有一个monitor类、一个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,这不是我想要实现的测试


有人能帮我吗?请随时询问您可能需要的任何澄清

看起来您实现了一个
可运行的
,但没有将其包装在线程中。我怀疑您是在
Runnable
上调用
run()
,而不是在线程上调用
start()
。检查上的教程部分


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

看起来您实现了一个
可运行的
,但没有将其包装在线程中。我怀疑您是在
Runnable
上调用
run()
,而不是在线程上调用
start()
。检查上的教程部分

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

您应该使用start方法调用(调用)threads run方法<应该使用
thread.start()
调用code>public void run()

应该是

r0.start();
您应该使用start方法调用(调用)threads run方法<应该使用
thread.start()
调用code>public void run()

应该是

r0.start();

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