সেমাফোর
সেমাফোর সাধারণত ব্যবহৃত হয় যখন ফাইল সিস্টেমের সাথে কাজ করার সময় থ্রেডের সংখ্যা সীমিত করার প্রয়োজন হয়। একটি ফাইল বা অন্য শেয়ার করা সম্পদ অ্যাক্সেস একটি কাউন্টার মাধ্যমে নিয়ন্ত্রিত হয়. যদি এর মান শূন্যের চেয়ে বেশি হয় তবে অ্যাক্সেস অনুমোদিত, তবে একই সময়ে কাউন্টারটি হ্রাস পাবে।
এই মুহুর্তে যখন কাউন্টারটি শূন্য দেয়, বর্তমান থ্রেডটি অবরুদ্ধ করা হবে যতক্ষণ না রিসোর্সটি অন্য থ্রেড দ্বারা প্রকাশ করা হয়। অনুমতি প্যারামিটারের সংখ্যা কনস্ট্রাক্টরের মাধ্যমে সেট করতে হবে।
আপনার কম্পিউটার বা ল্যাপটপের শক্তির উপর নির্ভর করে আপনাকে পৃথকভাবে এই প্যারামিটারটি নির্বাচন করতে হবে।
public class Main {
public static void main(String[] args) {
Semaphore sem = new Semaphore(1);
CommonResource res = new CommonResource();
new Thread(new MyThread(res, sem, "MyThread_1")).start();
new Thread(new MyThread(res, sem, "MyThread_2")).start();
new Thread(new MyThread(res, sem, "MyThread_3")).start();
}
}
class CommonResource {
int value = 0;
}
class MyThread implements Runnable {
CommonResource commonResource;
Semaphore semaphore;
String name;
MyThread(CommonResource commonResource, Semaphore sem, String name) {
this.commonResource = commonResource;
this.semaphore = sem;
this.name = name;
}
public void run() {
try {
System.out.println(name + "waiting permission");
semaphore.acquire();
commonResource.value = 1;
for (int i = 1; i < 7; i++) {
System.out.println(this.name + ": " + commonResource.value);
commonResource.value++;
Thread.sleep(150);
}
} catch (InterruptedException e) {
System.out.println(e.getMessage() + " " + name);
Thread.currentThread().interrupt();
}
System.out.println(name + "releases permission");
semaphore.release();
}
}
CountDownLatch এবং অন্যান্য
CountDownLatch - অন্যান্য থ্রেডে সম্পাদিত একটি নির্দিষ্ট সংখ্যক অপারেশন সম্পূর্ণ না হওয়া পর্যন্ত একাধিক থ্রেডকে অপেক্ষা করার অনুমতি দেয়। একটি উদাহরণ হল একটি অ্যাপ্লিকেশনের ইনস্টলেশন: এটি শুরু হবে না যতক্ষণ না আপনি ব্যবহারের শর্তাবলী স্বীকার করেন, যতক্ষণ না আপনি একটি ফোল্ডার নির্বাচন করবেন যেখানে একটি নতুন প্রোগ্রাম ইনস্টল করতে হবে, ইত্যাদি। এটির জন্য একটি বিশেষ কাউন্টডাউন() পদ্ধতি রয়েছে- এই পদ্ধতিটি কাউন্ট ডাউন কাউন্টারকে এক করে হ্রাস করে।
যত তাড়াতাড়ি গণনা শূন্যে চলে যাবে, অপেক্ষায় থাকা সমস্ত অপেক্ষমাণ থ্রেডগুলি তাদের কাজ চালিয়ে যাবে এবং অপেক্ষার পরবর্তী সমস্ত কলগুলি অপেক্ষা না করেই চলে যাবে। কাউন্ট ডাউন কাউন্টার একটি এককালীন কাউন্টার এবং পুনরায় সেট করা যাবে না।
CyclicBarrier - এক পর্যায়ে নির্দিষ্ট সংখ্যক থ্রেড সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়। যখন N থ্রেড await(...) পদ্ধতিতে কল করে এবং ব্লক করে তখন বাধা পৌঁছে যায়। এর পরে, কাউন্টারটি তার আসল মানটিতে পুনরায় সেট করা হয়েছে এবং অপেক্ষার থ্রেডগুলি মুক্তি পাবে। অতিরিক্তভাবে, প্রয়োজন হলে, থ্রেড আনব্লক করার আগে এবং কাউন্টার রিসেট করার আগে কাস্টম কোড চালানো সম্ভব। এটি করার জন্য, রানেবল ইন্টারফেসের বাস্তবায়ন সহ একটি অবজেক্ট।
এক্সচেঞ্জার<V> — এক্সচেঞ্জার ক্লাসটি থ্রেডের মধ্যে ডেটা বিনিময়ের উদ্দেশ্যে। এটি টাইপ করা হয় এবং থ্রেডগুলির আদান-প্রদানের জন্য প্রয়োজনীয় ডেটা টাইপ করে।
এই শ্রেণীর একমাত্র বিনিময়() পদ্ধতি ব্যবহার করে ডেটা বিনিময় করা হয় :
V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
এক্স প্যারামিটার বিনিময় করা ডেটা বাফার প্রতিনিধিত্ব করে। পদ্ধতির দ্বিতীয় ফর্মটি টাইমআউট প্যারামিটার , টাইমআউট এবং ইউনিট , টাইমআউট প্যারামিটারের জন্য ব্যবহার করার জন্য টাইম ইউনিটের ধরণকেও সংজ্ঞায়িত করে ।
Phaser ক্লাস আপনাকে থ্রেডগুলিকে সিঙ্ক্রোনাইজ করতে দেয় যা একটি সামগ্রিক ক্রিয়া সম্পাদনে একটি একক ফেজ বা পর্যায়কে প্রতিনিধিত্ব করে। Phaser একটি সিঙ্ক্রোনাইজেশন অবজেক্টকে সংজ্ঞায়িত করে যা একটি নির্দিষ্ট ফেজ সম্পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করে। Phaser তারপর পরবর্তী পর্যায়ে বা পর্যায়ে চলে যায় এবং এটি আবার সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।
Phaser ক্লাসের সাথে কাজ করার সময় , প্রথমে এটির অবজেক্ট তৈরি করা সাধারণ। পরবর্তী, আমাদের সমস্ত অংশগ্রহণকারীদের নিবন্ধন করতে হবে। প্রতিটি অংশগ্রহণকারীর জন্য নিবন্ধন করার জন্য, register() পদ্ধতিটিকে বলা হয়, অথবা আপনি Phaser কন্সট্রাক্টরের কাছে প্রয়োজনীয় সংখ্যক অংশগ্রহণকারীদের পাস করে এই পদ্ধতি ছাড়া করতে পারেন ।
তারপরে প্রতিটি অংশগ্রহণকারী একটি নির্দিষ্ট সেট সঞ্চালন করে যা ফেজ তৈরি করে। এবং Phaser সিঙ্ক্রোনাইজার অপেক্ষা করে যতক্ষণ না সমস্ত অংশগ্রহণকারীরা ফেজটি সম্পাদন সম্পন্ন করে। সিঙ্ক্রোনাইজারকে জানানোর জন্য যে ফেজটি শেষ হয়েছে, অংশগ্রহণকারীকে অবশ্যই পৌঁছাতে হবে () বা welcomeAndAwaitAdvance() পদ্ধতিতে কল করতে হবে । সিঙ্ক্রোনাইজার তারপর পরবর্তী পর্যায়ে চলে যায়।
GO TO FULL VERSION