由于位置Assert.assertArrayEquals
中的元素不同,45965
失败,这意味着第一个线程的最后一个byte
是错误的(但它仍然以某种方式写入)而我不这样做理解为什么。
以下是代码:
int repetitions = 3;
byte[] inputByte = new byte[183860];
int numThreads = 4;
int minItemsPerThread = inputByte.length / numThreads;
int maxItemsPerThread = minItemsPerThread + 1;
int threadsWithMaxItems = inputByte.length - numThreads * minItemsPerThread;
int start = 0;
final CountDownLatch latch = new CountDownLatch(numThreads);
final byte[] threadResult = new byte[inputByte.length * repetitions];
for (int i = 0; i < numThreads; i++) {
int itemsCount = (i < threadsWithMaxItems ? maxItemsPerThread : minItemsPerThread);
int end = start + itemsCount;
final byte[] array = Arrays.copyOfRange(inputByte, start, end);
final int fStart = start;
// Thread
executor.submit(() -> {
ByteArrayInputStream bis = new ByteArrayInputStream(array);
ByteArrayOutputStream bos = new ByteArrayOutputStream(array.length * repetitions);
// Processing
myObject.process(bis, bos);
byte[] result = bos.toByteArray();
// Write in final result array
System.arraycopy(result, 0, threadResult, fStart, itemsCount);
latch.countDown();
});
start = end;
}
latch.await();
// Stream setup
ByteArrayInputStream bis = new ByteArrayInputStream(inputByte);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// Processing
myObject.process(bis, bos);
outputByte = bos.toByteArray();
Assert.assertArrayEquals(outputByte, threadResult);
答案 0 :(得分:0)
这里的问题不是并发执行。 result
的尺寸为itemsCount
* repetitions
。但是,您只需将itemsCount
个元素复制到threadResult
。但最终assertArrayEquals
失败,因为threadResult
比outputByte
大三倍。顺便说一句。您应该始终发布可运行的代码,以便人们可以自己测试它。