多线程代码返回迭代的不同结果

时间:2015-12-17 21:18:29

标签: java arrays multithreading

由于位置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);

1 个答案:

答案 0 :(得分:0)

这里的问题不是并发执行。 result的尺寸为itemsCount * repetitions。但是,您只需将itemsCount个元素复制到threadResult。但最终assertArrayEquals失败,因为threadResultoutputByte大三倍。顺便说一句。您应该始终发布可运行的代码,以便人们可以自己测试它。