gpt4 book ai didi

java - 使用 JUnit 测试多线程代码 - 奇怪的行为

转载 作者:行者123 更新时间:2023-11-29 03:54:47 25 4
gpt4 key购买 nike

我是 Java 并发的新手。我使用 Junit 测试了我的一些代码,但结果很奇怪。下面的代码片段在我使用 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 测试多线程代码?

最好的问候。

最佳答案

您的测试方法必须阻止执行,直到线程完成。

考虑使用线程池。参见 ExecutorService.awaitTemination更多...

关于java - 使用 JUnit 测试多线程代码 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com