【发布时间】:2011-08-06 17:11:53
【问题描述】:
我是 Java 并发的新手。我用 Junit 测试了我的一些代码,但结果很奇怪。下面的代码 sn-p 虽然成功执行,但当我使用 JUnit (Eclipse) 运行它时,它不会向控制台写入任何内容。
@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();
}
但是,如果我使用 main 方法运行,它可以工作:
// 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 测试多标题代码?
最好的问候。
【问题讨论】:
-
您可能对此感兴趣:stackoverflow.com/questions/12159/…
标签: java multithreading junit io