我有一個Spring服務,我想測試它的併發線程的正確性。Java多線程不會在單元測試中更新值
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SerialNumberServiceTest {
@Autowired
private SerialNumberService service;
private final static int NUM_THREADS = 10;
private final static int NUM_ITERATIONS = 100;
@Test
public void testSynchronized(){
ExecutorService executor = Executors.newFixedThreadPool(10);
final Set<String> result = new HashSet<String>();
int size = 0;
for(int i = 0; i < NUM_THREADS; i++){
executor.submit(new Runnable() {
@Override
public void run() {
for (int j = 0; j < NUM_ITERATIONS; j++) {
String code = service.generateSerialNumberByModelCode("LP");
result.add(code);
}
}
});
}
assertEquals(NUM_ITERATIONS * NUM_THREADS, result.size());
}
}
我想聲明生成了多少代碼並檢查是否有重複代碼。 但結果設置爲空。我不知道爲什麼。另一方面,如果我嘗試在線程中更新服務實例的值,我也會發現這些值不會保存。例如
public void run() {
for (int j = 0; j < NUM_ITERATIONS; j++) {
String code = service.generateSerialNumberByModelCode("LP");
service.incrValue();
result.add(code);
}
}
最後,service.getValue()是不變的。
任何人都可以爲我解釋這個嗎?
感謝@ john16384,我將Set更改爲ConcurrentHashMap,並添加了executor.awaitTermination(5,TimeUnit.SECONDS)。這個可以嗎? – BurnetZhong
你有很高的機會做你期望的事情。再測試一下,看看它現在是否按預期工作。不要忘記在'awaitTermination'之前調用'shutdown'。 – john16384