धागे एक ही विभाजन दूसरे पर शुरू होना चाहिए। मैं समझता हूं, यदि आप करते हैं thread1.start(), तो अगले निष्पादन से पहले कुछ मिलीसेकंड लगेगा thread2.start()।
क्या यह भी संभव है या असंभव है?
धागे एक ही विभाजन दूसरे पर शुरू होना चाहिए। मैं समझता हूं, यदि आप करते हैं thread1.start(), तो अगले निष्पादन से पहले कुछ मिलीसेकंड लगेगा thread2.start()।
क्या यह भी संभव है या असंभव है?
जवाबों:
थ्रेड्स को ठीक उसी समय शुरू करने के लिए (कम से कम जितना संभव हो उतना अच्छा), आप साइक्लिक बैरियर का उपयोग कर सकते हैं :
// We want to start just 2 threads at the same time, but let's control that
// timing from the main thread. That's why we have 3 "parties" instead of 2.
final CyclicBarrier gate = new CyclicBarrier(3);
Thread t1 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
Thread t2 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
t1.start();
t2.start();
// At this point, t1 and t2 are blocking on the gate.
// Since we gave "3" as the argument, gate is not opened yet.
// Now if we block on the gate from the main thread, it will open
// and all threads will start to do stuff!
gate.await();
System.out.println("all threads started");
यह एक होना जरूरी नहीं है CyclicBarrier, आप एक CountDownLatchया यहां तक कि एक ताला भी इस्तेमाल कर सकते हैं ।
यह अभी भी सुनिश्चित नहीं कर सकता है कि वे मानक जेवीएम पर ठीक उसी समय शुरू किए गए हैं , लेकिन आप बहुत करीब हो सकते हैं। जब आप उदाहरण प्रदर्शन परीक्षणों के लिए करते हैं तब भी बहुत करीब आना उपयोगी होता है। उदाहरण के लिए, यदि आप किसी डेटा संरचना के थ्रूपुट को मापने की कोशिश कर रहे हैं, तो विभिन्न प्रकार के धागे इसे मार रहे हैं, तो आप इस तरह के निर्माण का उपयोग करना चाहते हैं ताकि सबसे सटीक परिणाम प्राप्त हो सके।
अन्य प्लेटफार्मों पर, थ्रेड शुरू करना वास्तव में एक बहुत ही वैध आवश्यकता है।
CreateEvent। msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
यह संभव नहीं है, कम से कम सिंगल कोर कंप्यूटर पर। लेकिन आप ऐसा क्यों चाहते हैं? यहां तक कि अगर आप एक ही सेकंड में दो धागे शुरू करने में सक्षम थे, तो भी वे अलग-अलग प्रगति करेंगे क्योंकि शेड्यूलिंग आपके नियंत्रण में नहीं है।
संपादित करें: (कुछ टिप्पणियों के जवाब में) यह कई धागे की स्थिति या प्रगति को सिंक्रनाइज़ करने के लिए एक पूरी तरह से वैध आवश्यकता है और CyclicBarrierएक महान उपकरण है। मैंने इस सवाल का जवाब दिया कि क्या एक ही समय में कई थ्रेड शुरू करना संभव है । CyclicBarrierगारंटी देंगे कि थ्रेड्स वांछित स्थिति में होने पर आगे बढ़ते हैं लेकिन यह गारंटी नहीं देता है कि वे ठीक उसी समय शुरू या फिर से शुरू करेंगे , हालांकि यह बहुत करीब हो सकता है। प्रश्न में सिंक्रोनाइज़ेशन आवश्यकताओं का कोई उल्लेख नहीं है।
आप इसके लिए एक CountDownLatch का उपयोग कर सकते हैं। कृपया एक नमूने के नीचे खोजें। हालांकि t1 और t2 शुरू हो गए हैं, लेकिन ये धागे मुख्य थैले के नीचे गिने जाने तक प्रतीक्षा करते रहते हैं। निर्माण में आवश्यक उलटी गिनती की संख्या का उल्लेख किया गया है। उलटी गिनती खत्म करने के लिए थ्रेड्स का इंतजार करने के लिए भी काउंटडाउन लैच का इस्तेमाल किया जा सकता है ताकि मुख्य धागा आगे (रिवर्स केस) आगे बढ़ सके। यह क्लास जावा 1.5 के बाद से शामिल की गई थी।
import java.util.concurrent.CountDownLatch;
public class ThreadExample
{
public static void main(String[] args)
{
CountDownLatch latch = new CountDownLatch(1);
MyThread t1 = new MyThread(latch);
MyThread t2 = new MyThread(latch);
new Thread(t1).start();
new Thread(t2).start();
//Do whatever you want
latch.countDown(); //This will inform all the threads to start
//Continue to do whatever
}
}
class MyThread implements Runnable
{
CountDownLatch latch;
public MyThread(CountDownLatch latch)
{
this.latch = latch;
}
@Override
public void run()
{
try
{
latch.await(); //The thread keeps waiting till it is informed
} catch (InterruptedException e) {
e.printStackTrace();
}
//Do the actual thing
}
}