Tôi đang cố gắng viết một phương thức tìm các chỉ mục của một đối tượng trong danh sách các danh sách và tận dụng lợi thế của tính song song. Đây là mã của tôi.Sử dụng các luồng để tìm một đối tượng trong danh sách các danh sách
// returns [i, j] where lists.get(i).get(j) equals o, or null if o is not present.
public static int[] indices(List<? extends List<?>> lists, Object o) {
return IntStream.range(0, lists.size())
.boxed()
.flatMap(i -> IntStream.range(0, lists.get(i).size()).mapToObj(j -> new int[]{i, j}))
.parallel()
.filter(a -> {
System.out.println(Arrays.toString(a)); // For testing only
return Objects.equals(o, lists.get(a[0]).get(a[1]));
})
.findAny()
.orElse(null);
}
Khi tôi chạy đoạn mã sau
List<List<String>> lists = Arrays.asList(
Arrays.asList("A", "B", "C"),
Arrays.asList("D", "E", "F", "G"),
Arrays.asList("H", "I"),
Collections.nCopies(5, "J")
);
System.out.println("Indices are " + Arrays.toString(indices(lists, "J")));
đầu ra là một cái gì đó giống như
[0, 0]
[0, 1]
[0, 2]
[3, 0]
[3, 1]
[3, 2]
[3, 3]
[2, 0]
[3, 4]
[1, 0]
[1, 1]
[2, 1]
[1, 2]
[1, 3]
Indices are [3, 0]
Nói cách khác, việc tìm kiếm vẫn tiếp tục ngay cả sau khi các đối tượng đã được tìm thấy. Không phải là findAny
phải là một hoạt động ngắn mạch? Tôi đang thiếu gì? Ngoài ra, cách tốt nhất để tận dụng lợi thế của tính song song khi lặp qua danh sách các danh sách hoặc một mảng bị lởm chởm là gì?
EDIT
Tiếp nối ý tưởng trong @ câu trả lời Sotirios, tôi có một sản lượng
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 0]
Thread[main,5,main] [2, 0]
Thread[main,5,main] [2, 1]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 0]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 1]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 2]
Thread[ForkJoinPool.commonPool-worker-1,5,main] [1, 3]
Thread[main,5,main] [0, 0]
Thread[main,5,main] [0, 1]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 1]
Thread[main,5,main] [0, 2]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 2]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 3]
Thread[ForkJoinPool.commonPool-worker-3,5,main] [3, 4]
Indices are [3, 0]
ý rằng
Thread[ForkJoinPool.commonPool-worker-3,5,main]
tiếp tục tìm kiếm ngay cả sau khi câu trả lời được tìm thấy.
sử dụng findFirst() để thay thế. –
@TaharBakir Nó vẫn tiếp tục tìm kiếm. –
Ngoài ra, song song có thể mất một thời gian trước khi một luồng có thể thông báo cho những người khác rằng họ không cần phải tiếp tục. –