2012-05-08 21 views
12

पर परिवर्तन के लिए प्रतीक्षा करने के लिए एक रास्ता है वहाँ बहुत एक AtomicInteger पर प्रतीक्षा करने के लिए मैं अपने वर्तमान धागा सो रखने के लिए और AtomicInteger इसएक परमाणु पूर्णांक

while(atomicInt.get() >= 0) { 
    Thread.sleep(1000) 
} 
तरह की जाँच कर रखने के लिए की जरूरत नहीं है कि एक तरीका होता है

मैं जानता हूँ कि एक CountDownLatch के रूप में ऐसी कोई बात नहीं है, लेकिन यह है कि केवल मुझे घटती को मैं भी बढ़ाने के लिए सक्षम होना चाहिए की अनुमति देता है

इसके अलावा पिछली कथा - मैं एक पाश धागे बनाने है और मैं एक पर प्रतीक्षा करने की आवश्यकता एक नया धागा बनाने से पहले धागे निष्पादन खत्म करने के लिए। हालांकि मैं Executors.newFixedThreadPool(numThreads) का उपयोग कर रहा हूं और इस पर प्रतीक्षा करने का एकमात्र तरीका शटडाउन विधि को समाप्त करने का इंतजार करना है और फिर एक नया थ्रेडपूल बनाना है, इसलिए मैं एक परमाणु पूर्णांक का उपयोग कर रहा था ताकि यह पता चल सके कि कितने धागे चल रहे थे और/या कतार पर ताकि जब उस संख्या में कमी आई तो मैं लूप के साथ जारी रख सकता था।

+6

संक्षिप्त उत्तर नहीं है। क्या आप अपना प्रश्न संपादित कर सकते हैं और थोड़ा और बता सकते हैं _why_ आप इसे चाहते हैं? अन्य विकल्प हो सकते हैं। – Gray

+0

प्रतीक्षा के लिए WaitForSingleObject का उपयोग क्यों न करें। प्रतीक्षा करने के लिए थोड़ी देर लूप बनाना एक भयानक विचार है। – CyprUS

+4

परमाणु वस्तु की प्रतीक्षा पूरी तरह से प्रतीक्षा-मुक्त एल्गोरिदम के उद्देश्य को हरा देती है। आप यह गलत कर रहे है। – maerics

उत्तर

2

मुझे लगता है कि आप वास्तव में क्या चाहते हैं कुछ घटनाओं को संसाधित करना है। वह घटना बदले में एक पूर्णांक वृद्धि कर सकती है। BlockingQueue पर एक झांक लें।

एक कतार जो अतिरिक्त रूप से संचालन का समर्थन करती है जो कतार के लिए तत्व को पुनर्प्राप्त करते समय खाली नहीं होने का इंतजार करती है, और तत्व को संग्रहीत करते समय कतार में स्थान उपलब्ध होने का इंतजार करती है।

कोड कुछ इस तरह दिखाई सकता है ...

MyEvent incrementEvent = queue.take(); //blocks until an event is added to the queue 
// increment int and do logic here 
6

Semaphore लगता है कि यह क्या आप के लिए देख रहे वास्तव में के करीब हो सकता है - यह आप एक या अधिक "परमिट तक इंतजार करने देता है " उपलब्ध है। AtomicInteger का उपयोग इस बात का नहीं है कि आप इसका उपयोग कैसे कर रहे हैं।

0

यदि आप एक्जिक्यूटर्स एपीआई का उपयोग कर रहे हैं, तो कार्य पूर्ण करने की प्रतीक्षा करने का सही तरीका भविष्य API का उपयोग कर रहा है। आप क्या चाहते हैं एक Phaser है

Future<?> future = threadPool.submit(task); 
future.get(); 
0

मैं एक करीब मैच लगता है: नमूना कोड के नीचे प्रदर्शित है। मेरी किसी न किसी समझ यह है कि यह एक बढ़ते काउंटर की तरह थोड़ा है जहां आप संख्या बढ़ाए जाने तक ब्लॉक कर सकते हैं।

// This constructor one party (so it expects one advance per phase). 
Phaser phaser = new Phaser(1); 
try { 
    // This will timeout as phase 0 hasn't arrived yet. 
    phaser.awaitAdvanceInterruptibly(0, 1, TimeUnit.MILLISECONDS); 
    fail(); 
} 
catch (TimeoutException expected) { 
} 

// Arrive phase 0 
phaser.arrive(); 
phaser.awaitAdvance(0); 
try { 
    // Phase 1 will timeout.. 
    phaser.awaitAdvanceInterruptibly(1, 1, TimeUnit.MILLISECONDS); 
    fail(); 
} 
catch (TimeoutException expected) { 
} 

// Arrive phase 1 
phaser.arrive(); 
phaser.awaitAdvance(0); 
phaser.awaitAdvance(1); 
संबंधित मुद्दे