我是新来的Java并发性。我用Junit来测试我的一些代码,但结果很奇怪。当我使用JUnit(Eclipse)运行它时,虽然它成功执行,但下面的代码片段没有向控制台写入任何内容。用JUnit测试多线程代码 - 奇怪的行为
@Test
public void testGetNameWithMultithreading() {
// code to create IndexFile and DictionaryFile...
...
Thread taskOne = new GetNameTask(packOneIndex, packOneDict);
Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict);
taskOne.start();
taskTwo.start();
}
但是,如果我与主要方法运行,它的工作原理:
// Switch to test with good-old main method.
public static void main(String args[]) {
// code to create IndexFile and DictionaryFile...
...
Thread taskOne = new GetNameTask(packOneIndex, packOneDict);
Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict);
taskOne.start();
taskTwo.start();
}
这是任务:
public class GetNameTask extends Thread {
public GetNameTask (IndexFile indexFile, DictionaryFile dictFile) {
this.dictFile = dictFile;
this.indexFile = indexFile;
}
@Override
public void run() {
Dictionary dictionary = new DICTDictionary(indexFile, dictFile);
System.out.println(dictionary.getName());
}
private final IndexFile indexFile;
private final DictionaryFile dictFile;
}
当构建DICTDictionary,有IO链操作从文件中获取字典的名称。
通过使用多线程运行IO代码的任何机会都不适用于JUnit?
编辑:我发现如何使它工作。因为JUnit在单线程上执行测试,所以我必须将我的2个小线程加入JUnit线程才能获得预期的结果。所以,这是有效的。
@Test
public void testGetNameWithMultithreading() {
// code to create IndexFile and DictionaryFile...
...
Thread taskOne = new GetNameTask(packOneIndex, packOneDict);
Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict);
taskOne.start();
taskTwo.start();
try {
taskOne.join();
taskTwo.join();
} catch (InteruptedException ie) {
ie.printStackTrace();
}
}
有没有更简单的方法来用JUnit测试多重代码?
此致敬礼。
您可能感兴趣的:http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Grundlefleck