থ্রেডগুলি একই বিভাজন দ্বিতীয় দিকে শুরু করা উচিত। আমি বুঝতে পারি 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বা এমনকি একটি লকও ব্যবহার করতে পারেন ।
এটি এখনও নিশ্চিত করতে পারে না যে সেগুলি শুরু হয়েছে ঠিক মান JVMs উপর একই সময়ে, কিন্তু আপনি চমত্কার বন্ধ পেতে পারেন। আপনি উদাহরণস্বরূপ কর্মক্ষমতা পরীক্ষার জন্য যখন করেন তখন খুব কাছাকাছি হওয়া এখনও কার্যকর। উদাহরণস্বরূপ, যদি আপনি বিভিন্ন সংখ্যক থ্রেডকে আঘাত করে একটি ডেটা স্ট্রাকচারের থ্রুপুট পরিমাপের চেষ্টা করছেন তবে সর্বাধিক সঠিক ফলাফল পেতে আপনি এই ধরণের রচনাটি ব্যবহার করতে চান।
অন্যান্য প্ল্যাটফর্মগুলিতে, থ্রেডগুলি ঠিক শুরু করা বিটিডব্লিউ হতে পারে।
CreateEvent। এমএসডিএন.মাইক্রোসফট.এইন.ইউস
এটি কমপক্ষে একক কোর কম্পিউটারে সম্ভব নয়। তবে কেন আপনি এটি চান? এমনকি যদি আপনি একই দ্বিতীয়টিতে দুটি থ্রেড শুরু করতে সক্ষম হন তবে সেগুলি আলাদাভাবে অগ্রসর হবে কারণ সময়সূচি আপনার নিয়ন্ত্রণে নেই।
সম্পাদনা করুন: (কিছু মন্তব্যের জবাবে) একাধিক থ্রেডের রাজ্য বা অগ্রগতি সিঙ্ক্রোনাইজ করার জন্য এটি পুরোপুরি বৈধ প্রয়োজন এবং CyclicBarrierএটি একটি দুর্দান্ত সরঞ্জাম। আমি ঠিক একই সময়ে একাধিক থ্রেড শুরু করা সম্ভব কিনা এই প্রশ্নের উত্তর দিয়েছি । CyclicBarrierগ্যারান্টি দিবে যে থ্রেডগুলি ঠিক যখন কাঙ্ক্ষিত অবস্থায় থাকবে তখন এটি গ্যারান্টি দেয় না যে তারা ঠিক একই সময়ে শুরু হবে বা পুনরায় শুরু করবে , যদিও এটি বেশ কাছাকাছি হতে পারে। প্রশ্নে সিঙ্ক্রোনাইজেশন প্রয়োজনীয়তার কোনও উল্লেখ নেই।
আপনি এটির জন্য একটি কাউন্টডাউনল্যাচ ব্যবহার করতে পারেন। একটি নমুনার নীচে সন্ধান করুন। যদিও টি 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
}
}