2014-12-01 17 views
10

Nếu tôi có luồng song song trong java 8 và tôi chấm dứt bằng anyMatch và bộ sưu tập của tôi có phần tử khớp với biến vị ngữ, tôi đang cố gắng tìm hiểu điều gì xảy ra khi một luồng xử lý thành phần này.Dòng Java 8 song song + anyMatch - các chuỗi có bị gián đoạn khi tìm thấy kết quả phù hợp không?

Tôi biết rằng anyMatch là ngắn mạch, vì vậy mà tôi sẽ không mong đợi các yếu tố tiếp tục được xử lý khi phần tử phù hợp được xử lý. Sự nhầm lẫn của tôi là về những gì xảy ra với các chủ đề khác, có lẽ là ở giữa các phần tử xử lý. Tôi có thể nghĩ đến 3 kịch bản chính đáng: a) Họ có bị gián đoạn không? b) Họ có tiếp tục xử lý phần tử mà họ đang làm việc hay không, và sau đó, khi tất cả các chủ đề không làm gì cả, tôi nhận được kết quả của mình? c) Tôi có nhận được kết quả của mình không, nhưng các luồng xử lý các phần tử khác tiếp tục xử lý các phần tử đó (nhưng không tiếp nhận các thành phần khác khi chúng đã hoàn thành)?

Tôi có một vị từ chạy dài, ở đó rất hữu ích để chấm dứt nhanh chóng ngay khi tôi biết rằng một phần tử phù hợp. Tôi lo lắng một chút vì tôi không thể tìm thấy thông tin này trong tài liệu mà nó có thể là một điều phụ thuộc thực hiện, mà cũng sẽ là tốt để biết.

Cảm ơn

Trả lời

21

Sau khi một số đào thông qua các mã nguồn Java Tôi nghĩ rằng tôi đã tìm thấy câu trả lời.

Các chủ đề khác định kỳ kiểm tra xem liệu một chuỗi khác có tìm thấy câu trả lời không và nếu có, thì chúng ngừng hoạt động và hủy bất kỳ nút nào chưa chạy.

java.util.Stream.FindOps$FindTask có phương pháp này:

private void foundResult(O answer) { 
     if (isLeftmostNode()) 
      shortCircuit(answer); 
     else 
      cancelLaterNodes(); 
    } 

lớp cha của nó, AbstractShortcircuitTask thực hiện shortCircuit như thế này:

/** 
* Declares that a globally valid result has been found. If another task has 
* not already found the answer, the result is installed in 
* {@code sharedResult}. The {@code compute()} method will check 
* {@code sharedResult} before proceeding with computation, so this causes 
* the computation to terminate early. 
* 
* @param result the result found 
*/ 
protected void shortCircuit(R result) { 
    if (result != null) 
     sharedResult.compareAndSet(null, result); 
} 

Và thực tế compute() phương pháp làm việc có dòng quan trọng này:

AtomicReference<R> sr = sharedResult; 
    R result; 
    while ((result = sr.get()) == null) { 
     ...//does the actual fork stuff here 
    } 

trong đó sharedResult được cập nhật theo phương pháp shortCircuit() để máy tính sẽ nhìn thấy nó vào lần sau nó kiểm tra điều kiện vòng lặp while.

EDIT Vì vậy, trong bản tóm tắt:

  1. Chủ đề không bị gián đoạn
  2. Thay vào đó, họ sẽ kiểm tra định kỳ để xem nếu ai đó đã tìm thấy câu trả lời và sẽ ngừng tiếp tục xử lý nếu câu trả lời đã được tìm thấy .
  3. Không có chủ đề mới nào được bắt đầu khi câu trả lời đã được tìm thấy.
+4

Thông tin rất chi tiết về mã triển khai nhưng tôi khuyên bạn nên thêm tóm tắt để giải quyết câu hỏi của OP, tức là "Điều gì sẽ xảy ra" → 'b' – Holger

+0

Ai đó có thể làm rõ - điều này cũng áp dụng cho hoạt động noneMatch và allMatch ? Vì vậy, nếu một chuỗi của allMatch tìm thấy một phần tử không phù hợp, làm các chủ đề khác định kỳ kiểm tra và sau đó dừng lại như là kết quả của điều này? – Tranquility

Các vấn đề liên quan