একই সময়ে "ঠিক" তে দুটি থ্রেড কীভাবে শুরু করবেন


92

থ্রেডগুলি একই বিভাজন দ্বিতীয় দিকে শুরু করা উচিত। আমি বুঝতে পারি thread1.start(), আপনি যদি করেন তবে এটির পরবর্তী প্রয়োগের আগে কিছু মিলিসেকেন্ড লাগবে thread2.start()

এটা কি সম্ভব নাকি অসম্ভব?


4
দ্বিতীয় স্প্লিট GHz গতিতে খুব দীর্ঘ সময়।
নিকোলাই ফেটিসিসভ

32
এত তীব্রভাবে ডাউনভোট করার দরকার নেই। থ্রেডিং সম্পর্কিত ননডেটেরিনিজম প্রত্যেকেই বোঝে না এবং আমাদের সবাইকে কোথাও কোথাও শুরু করতে হবে।
মাইকেল পেট্রোটা

7
ডাউনভোটগুলি বুঝবেন না। থ্রেডগুলির মধ্যে সিঙ্ক্রোনাইজ করা খুব সাধারণ প্রয়োজনীয়তা। হ্যাঁ জাভাতে আপনি তাদের ঠিক সমান্তরালে সম্পাদন করতে পারবেন না (যা অন্যান্য প্ল্যাটফর্মে খুব কার্যকর প্রয়োজন বিটিডব্লু হতে পারে) তবে সময়ে সময়ে এটি খুব সাধারণ যে আপনাকে তাদের ক্রিয়াকে সিঙ্ক্রোনাইজ করতে হবে। যে কারণে জেডিকে ক্লাস রয়েছে। হয়তো বাক্যে কথন সঠিক ছিলেন না কিন্তু জাহান্নাম যদি সে সেটা জানি চাই, তিনি প্রশ্ন জিজ্ঞাসা হতো না ..
Enno Shioji

ঠিক আছে, আমি অনুমান করি আমি আপনার সমস্ত রাগ বুঝতে পেরেছি। এটি একটি সাক্ষাত্কারে আমাকে জিজ্ঞাসা করা একটি প্রশ্ন ছিল ... সম্ভবত একটি কৌশল ছিল প্রশ্ন। তবে, আমি কেবল বিভ্রান্ত হয়ে পড়েছিলাম এবং এটি নিশ্চিত করতে চেয়েছিলাম। এই কারণেই আমি জিজ্ঞাসা করেছি এটি সম্ভব কিনা।
ফিগারো

4
@ জাভাগুয়ে - একটি "কৌশল" প্রশ্ন নয়। বরং আপনি সাধারণভাবে মাল্টি-থ্রেড প্রোগ্রামিং কতটা ভালভাবে বুঝতে পারবেন তা দেখার জন্য একটি প্রশ্ন বেছে নেওয়া হয়েছে ... পাশাপাশি জাভা ক্ষেত্রেও।
স্টিফেন সি

উত্তর:


136

ঠিক একই সময়ে থ্রেডগুলি শুরু করতে (কমপক্ষে যতটা সম্ভব সম্ভব ভাল), আপনি সাইক্লিকবারিয়ার ব্যবহার করতে পারেন :

// 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বা এমনকি একটি লকও ব্যবহার করতে পারেন ।

এটি এখনও নিশ্চিত করতে পারে না যে সেগুলি শুরু হয়েছে ঠিক মান JVMs উপর একই সময়ে, কিন্তু আপনি চমত্কার বন্ধ পেতে পারেন। আপনি উদাহরণস্বরূপ কর্মক্ষমতা পরীক্ষার জন্য যখন করেন তখন খুব কাছাকাছি হওয়া এখনও কার্যকর। উদাহরণস্বরূপ, যদি আপনি বিভিন্ন সংখ্যক থ্রেডকে আঘাত করে একটি ডেটা স্ট্রাকচারের থ্রুপুট পরিমাপের চেষ্টা করছেন তবে সর্বাধিক সঠিক ফলাফল পেতে আপনি এই ধরণের রচনাটি ব্যবহার করতে চান।

অন্যান্য প্ল্যাটফর্মগুলিতে, থ্রেডগুলি ঠিক শুরু করা বিটিডব্লিউ হতে পারে।


4
+1 টি চমৎকার চিন্তা ;-) যদিও অবশ্যই এটা থ্রেড এ শুরু না ঠিক রিয়েল টাইমে একই সময় (অন্তত একটি একক কোর চিপের উপর না, এবং এমনকি একটি মাল্টি-কোর চিপের উপর নিশ্চিত নয়) কিন্তু এর থেকে ভাল করার কোনও উপায় আমি ভাবতে পারি না।
ডেভিড জেড

এই পরিবেশে নির্দিষ্ট অপেক্ষার হুক হুক?
কেওসপ্যান্ডিয়ন

@ চাওসপ্যান্ডিয়ন: বিস্তৃত করার জন্য যত্ন?
সান্তা

@ সান্তা - উইন 32 এপিআই উদাহরণস্বরূপ বিভিন্ন আদিম প্রস্তাব দেয়। একটি দরকারী প্রকার হ'ল ম্যানুয়াল রিসেট ইভেন্টটি যখন আপনি কল করবেন তখন ফিরে আসবে CreateEventএমএসডিএন.মাইক্রোসফট.এইন.ইউস
লিবারি /ms686364%28VS.85%29.aspx

4
@ জেডউই - আচ্ছা, যাই হোক না কেন, আমি উত্তরটি পোস্ট করতাম যদি আমি জাভা গুরু হতাম।
কেওসপ্যান্ডিয়ন

15

এটি কমপক্ষে একক কোর কম্পিউটারে সম্ভব নয়। তবে কেন আপনি এটি চান? এমনকি যদি আপনি একই দ্বিতীয়টিতে দুটি থ্রেড শুরু করতে সক্ষম হন তবে সেগুলি আলাদাভাবে অগ্রসর হবে কারণ সময়সূচি আপনার নিয়ন্ত্রণে নেই।

সম্পাদনা করুন: (কিছু মন্তব্যের জবাবে) একাধিক থ্রেডের রাজ্য বা অগ্রগতি সিঙ্ক্রোনাইজ করার জন্য এটি পুরোপুরি বৈধ প্রয়োজন এবং CyclicBarrierএটি একটি দুর্দান্ত সরঞ্জাম। আমি ঠিক একই সময়ে একাধিক থ্রেড শুরু করা সম্ভব কিনা এই প্রশ্নের উত্তর দিয়েছি । CyclicBarrierগ্যারান্টি দিবে যে থ্রেডগুলি ঠিক যখন কাঙ্ক্ষিত অবস্থায় থাকবে তখন এটি গ্যারান্টি দেয় না যে তারা ঠিক একই সময়ে শুরু হবে বা পুনরায় শুরু করবে , যদিও এটি বেশ কাছাকাছি হতে পারে। প্রশ্নে সিঙ্ক্রোনাইজেশন প্রয়োজনীয়তার কোনও উল্লেখ নেই।


4
আপনি যদিও কাছাকাছি সুন্দর রঞ্জক পেতে পারেন। এটি সমস্ত আপনি যে সিঙ্ক্রোনাইজেশন কৌশলগুলি ব্যবহার করেন এবং অবশ্যই তার চেয়ে বেশি 1 সিপিইউ বা কোর রয়েছে তার
কেওসপ্যান্ডিয়ন

ধারণাটি হ'ল এটি ভুল-নেতৃত্বাধীন পদ্ধতি এবং হার্ড-রিয়েল-টাইম পরিবেশে প্রয়োজনীয় হওয়া উচিত নয়, এটি "বেশ কাছাকাছি" নয়।
নিকোলাই ফেটিসিসভ

4
এটা এছাড়াও অসম্ভব কারণ জাভা থ্রেড সিডিউলিং আপনি মিলিসেকেন্ডে সঠিকতা দেয় না।
স্টিফেন সি

4
@ জেডউই - অন্যথায় নিষ্ক্রিয় মেশিনে আপনি সম্ভবত বেশিরভাগ সময় "জঘন্য বন্ধ" পেতে পারেন। তবে আপনার যদি এটির সব সময় প্রয়োজন হয় তবে আপনাকে সি এর মতো ভাষায়, ওএসে হার্ড রিয়েলটাইম সমর্থন সহ একটি মেশিনে প্রোগ্রাম করতে হবে। আপনি আপনার থ্রেড শুরু করতে চান "বিভক্ত দ্বিতীয়" তে জেভিএম একটি সম্পূর্ণ জিসি চালাচ্ছে বলেও বিবেচনা করুন।
স্টিফেন সি

4
এটি একটি সম্পূর্ণ বৈধ সিঙ্ক্রোনাইজেশন সমস্যা। থ্রেডগুলিকে কিছু ডেটা শুরু করতে হবে, তা নিশ্চিত করে নিন যে যথাযথ বৈধতা ছাড়াই কেউ কোনও সমালোচনামূলক অঞ্চলে না যায়। এবং সাইক্লিক বেরিয়ারটিকে জাভাস সমবর্তী প্যাকেজের অন্তর্ভুক্ত করার অর্থ এটি একটি গুরুত্বপূর্ণ সমস্যা।
ডেনিস তুলসকি

14

আপনি এটির জন্য একটি কাউন্টডাউনল্যাচ ব্যবহার করতে পারেন। একটি নমুনার নীচে সন্ধান করুন। যদিও টি 1 এবং টি 2 শুরু হয়েছে, মূল থ্রেডটি ল্যাচটি গণনা করা অবধি এই থ্রেডগুলি অপেক্ষা করতে থাকবে। প্রয়োজনীয় কাউন্টডাউনগুলির সংখ্যা নির্মাত্রে উল্লেখ করা হয়েছে। কাউন্টডাউন ল্যাচগুলি থ্রেডগুলি সম্পাদন শেষ করতে অপেক্ষা করতেও ব্যবহৃত হতে পারে যাতে মূল থ্রেড আরও এগিয়ে যেতে পারে (বিপরীত ক্ষেত্রে)। এই ক্লাসটি জাভা 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
    }
}

এই উত্তরটি কোড উদাহরণে কম বয়লারপ্লেট থেকে উপকৃত হতে পারে।
ব্যবহারকারী 2418306

6
  1. আমি যেমন এটি বুঝতে পারি, জেভিএম বেশিরভাগই এই জিনিসটিকে অপারেটিং সিস্টেমে প্রতিনিধিত্ব করে। সুতরাং উত্তরটি ওএস-নির্দিষ্ট হবে।
  2. এটি একটি একক-প্রসেসর মেশিনে পরিষ্কারভাবে অসম্ভব।
  3. এটি একটি মাল্টি-প্রসেসর মেশিনের ক্ষেত্রে আরও জটিল। যুগোপযোগীতার আপেক্ষিকতা অনুসারে , "এই ঘটনাগুলিকে স্পেসে পৃথক করা হলে একই সাথে দুটি ঘটনা ঘটে কিনা তা নিখুঁত অর্থে বলা অসম্ভব।" আপনার প্রসেসরগুলি যতই কাছাকাছি থাকুক না কেন, তারা স্পেসে পৃথক হয়ে গেছে।
    1. আপনি যদি আপেক্ষিক যুগপততা গ্রহণ করতে পারেন তবে অন্যান্য প্রতিক্রিয়াগুলিতে আলোচিত কৌশলগুলি ব্যবহার করে এটি সম্ভবত অনুকরণ করা সহজ।

4
... এবং এমনকি যদি আমরা একসাথে সূচনা করি, প্রতিটি থ্রেডের নিজস্ব টাইমলাইন রয়েছে, সেগুলি সমস্ত একই সাথে সমান্তরাল , তবে অগত্যা সমান্তরাল নয়, তাই থ্রেডের যুগপততা সম্পর্কে কেউ যেভাবেই ধরে নেয় (পরবর্তী) পরবর্তী ন্যানোসেকেন্ডে বাতিল হতে পারে (যে কোনওটিই টাইমলাইন)…
হোলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.