Tôi có một bộ dữ liệu quan trọng và muốn gọi phương thức chậm, nhưng sạch sẽ và gọi phương thức nhanh với các hiệu ứng phụ trên kết quả của thao tác đầu tiên. Tôi không quan tâm đến kết quả trung gian, vì vậy tôi không muốn thu thập chúng.Gọi tuần tự trên luồng song song làm cho tất cả các hoạt động trước đó theo thứ tự
Giải pháp rõ ràng là tạo luồng song song, thực hiện cuộc gọi chậm, tạo luồng liên tiếp một lần nữa và thực hiện cuộc gọi nhanh. Vấn đề là, TẤT CẢ mã thực hiện trong chủ đề duy nhất, không có song song thực tế.
Ví dụ mã:
@Test
public void testParallelStream() throws ExecutionException, InterruptedException
{
ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
Set<String> threads = forkJoinPool.submit(()-> new Random().ints(100).boxed()
.parallel()
.map(this::slowOperation)
.sequential()
.map(Function.identity())//some fast operation, but must be in single thread
.collect(Collectors.toSet())
).get();
System.out.println(threads);
Assert.assertEquals(Runtime.getRuntime().availableProcessors() * 2, threads.size());
}
private String slowOperation(int value)
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return Thread.currentThread().getName();
}
Nếu tôi loại bỏ sequential
, mã thực hiện như mong đợi, nhưng, rõ ràng, hoạt động không song song sẽ được gọi theo nhiều chủ đề.
Bạn có thể giới thiệu một số tham chiếu về hành vi đó hay có thể một số cách để tránh các bộ sưu tập tạm thời?
Câu bạn đã trích dẫn là chính xác giống nhau trong phiên bản Java 8, được tìm thấy tại cùng một vị trí, đoạn cuối cùng của tài liệu lớp học. Nói chung, bạn tìm thêm thông tin tại [tài liệu gói] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps) (xem “Song song”)) so với [phương pháp cụ thể] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#parallel--), không chỉ với chế độ song song/tuần tự (so sánh với Giảm, ví dụ). – Holger
Cũng được phát hiện! Tôi biết rằng nó đã được cập nhật (http://hg.openjdk.java.net/jdk9/dev/jdk/rev/d52b2d49bf04) (Tôi thậm chí còn tham gia thảo luận và [thuyết phục] (http: //mail.openjdk. java.net/pipermail/core-libs-dev/2015-August/034773.html) Stuart để thêm ghi chú đặc biệt cho 'concat'), nhưng vì một số lý do tìm thấy địa điểm sai. Đã chỉnh sửa bài đăng. –