我是新來的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