2014-12-01 11 views
10

Java 8'de paralel bir akışım varsa ve bir anyMatch ile sonlandırıyorum ve koleksiyonumun yüklemle eşleşen bir öğesi var, bir öğe bu öğeyi işlediğinde ne olacağını anlamaya çalışıyorum.Java 8 paralel akış + anyMatch - iş parçacığı bir eşleşme bulunduğunda kesintiye uğruyor mu?

Herhangi bir eşiğin kısa devre yaptığını biliyorum, böylece eşleşen öğe işlendikten sonra başka öğelerin işlenmesini beklemem. Benim karışıklığım, diğer iş parçacıklarına ne olduğu hakkında, muhtemelen işleme öğelerinin ortasında olan şey. 3 makul senaryoyu düşünebilirim: a) Onlar kesintiye uğruyor mu? b) Üzerinde çalıştıkları öğeyi işlemeye devam ediyorlar ve sonra tüm iş parçacıkları hiçbir şey yapmadığında sonucumu alır mıyım? c) Sonucu alabilir miyim, ancak diğer öğeleri işleyen iş parçacıkları bu öğeleri işlemeye devam eder (ancak tamamlandıktan sonra başka öğeleri almazlar)?

Uzun süredir devam eden bir yüklemem var, bir öğenin eşleştiğini bildiğim kadar hızlı bir şekilde sonlandırmanın çok yararlı olduğu yer. Biraz endişeleniyorum, çünkü bu bilgiyi, uygulamada bağımlı bir şey olabileceğine dair belgelerde bulamıyorum, ki bu da bilmek güzel olurdu.

Teşekkür

bazı Java kaynak kod kazma sonra

cevap

21

ben cevabı buldum.

Diğer iş parçacıkları periyodik olarak başka bir iş parçacığının yanıtı bulup bulmadığını kontrol eder ve eğer öyleyse, çalışmayı durdurur ve henüz çalışmayan tüm düğümleri iptal ederler.

/** 
* 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); 
} 

Ve iş bu önemli hattı vardır does gerçek compute() yöntemi:

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

Kendi ana sınıfı, AbstractShortcircuitTask böyle shortCircuit uygular:

java.util.Stream.FindOps$FindTask

bu yöntemi vardır
AtomicReference<R> sr = sharedResult; 
    R result; 
    while ((result = sr.get()) == null) { 
     ...//does the actual fork stuff here 
    } 

, shortCircuit() yöntemiyle sharedResult yöntemini güncelleştirir; bu nedenle hesaplama, while döngüsü koşulunu denetlediğinde bunu görecektir.

DÜZENLEME özetinde Yani: cevap

  1. konu
  2. yerine kesintiye değildir, bunlar periyodik birisi cevap buldu olmadığını kontrol edecek ve daha fazla işlem duracaktır bulunmuştur eğer .
  3. Yanıt bulunamadığında yeni konu başlatılamadı.
uygulama kodu hakkında çok detaylı bilgiler var
+4

ama sonunda – Holger

+0

birisi açıklık getirebilir b' '→“ne olacak”OP'ın sorusunu, yani adresleri bir özetleme eklemenizi öneririz - bu da noneMatch ve allMatch işlemleri için geçerlidir ? Yani allMatch bir iş parçacığı eşleşmeyen bir öğe bulursa, diğer iş parçacıkları düzenli olarak denetler ve bunun sonucunda dururlar? – Tranquility

İlgili konular