2016-06-10 25 views
7

Java'da kesinti ile aşağıdaki "deyim" kullanılıyorsa, örneğin from this answer. take bir engelleme operasyondurJava'da "atomik" kesme kontrolü mümkün mü?

while (!Thread.currentThread().isInterrupted()) { 
    try { 
     Object value = queue.take(); 
     handle(value); 
    } catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } 
} 

, bir kesme Thread.currentThread().isInterrupted() ait çek ve çağrı queue.take() arasında "geldiğinde" eğer şu an için göz ardı edilemeyecek kesme olabilir? Bu "kontrol-eylem" işlemi değil mi? Eğer öyleyse, iş parçacığı kesintiye uğrarsa, döngü her halükarda bırakılacağı garanti edilebilir mi?

poll with a timeout kullanmak, döngü zaman aşımından sonra bırakılır, ancak kesintili durumu kontrol etmek ve atomik olarak hareket etmek mümkün mü?

+2

Yukarıdaki kod tarafından nasıl bir kesinti yapılmaz? İşe alma çağrısından önce iş parçacığının kesintiye uğraması durumunda queue.take() öğesinin hemen atılacağını biliyorsunuz, değil mi? –

+0

@JBNizet: Kodu kontrol ettim ve haklısınız, "InterruptedException" ifadesini fırlatıp, önce girilen durumu kontrol et ve at. Bir cevap eklerseniz, kabul edeceğim. – user140547

cevap

3

Ben try/catch ve döngü sırasında takas olur:

try { 
    while (true) { 
    Object value = queue.take(); 
    handle(value); 
    } 
} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
} 

take() operasyon iplik kesildiğinde derhal bir InterruptedException atmak ve süre döngünün dışında aynı zaman kopma olacaktır.

+0

Kesme işleminde kullanım sırasında, istisna atılamayabilir. Yani - emin olmak için, genellikle kullanıyorum (! Thread.currentThread(). IsInterrupted()) – gusto2

+0

@GabrielVince Lütfen "istisna atılamaz" altındaki koşulları açıklayınız. –

+0

"tutamaç (..)" yönteminin bazı hesaplamalar yapması durumunda, mutlaka G/Ç'yi beklemeden ve iş parçacığı kesintiye uğratılmadan, istisna atılmadığında. Döngüde kontrol ederim. İş parçacığı zaten kesintiye uğramış durumla girerken engelleme G/Ç'nin bir istisna atacağını varsaymazdım (JB.Nizet'den gelen yorum tersi durumda ve burada yanılıyor olabilirim). – gusto2

0

Yalnızca bir arama kesildikten sonra bayrağın kesilip kesilmemesi, dolayısıyla aradaki hiçbir şeyin gerçekleşmemesidir. Yanlış ve sıraya alma().

0

ama mümkün Eh o atomik

üzerinde kesintiye durumunu ve hareket kontrol etmektir - Burada "atomik" Ne demek istediğini bilmiyorum. Bizde, Interrupt (...) gibi bir şey istediğini varsayabilir miyiz?

Kesmeler, iş parçacığı "kesme" anlamına gelir, bu nedenle tüm varsayılan G/Ç işlemleri, yakalayabileceğiniz veya denetleyebileceğiniz bir InterruptedException oluşturur. İş parçacığı, kilitli kaynakların hassas bir şekilde kapatılmasını/serbest bırakılmasını durdurma fırsatını verir.

Olay işleme sırasında, kendi iptal etkinliklerinizi (varsayılan olarak JRE kesintilerini değil) gerçekleştirebileceğiniz bir Cancellable task uygulamak isteyebilirsiniz.