Java এর java.util.concurrent প্যাকেজ মাল্টিথ্রেডিং এবং কনকারেন্ট প্রোগ্রামিংয়ের জন্য বিভিন্ন শক্তিশালী টুলস এবং ইউটিলিটি সরবরাহ করে। এই প্যাকেজটি Java 5-এ পরিচিত হয়েছিল এবং এর পরে আরও উন্নত হয়েছে।
Utility Overview
java.util.concurrent প্যাকেজ প্রধানত নিম্নলিখিত বিষয়গুলো কভার করে:
- Executors এবং Thread Pools
- থ্রেড তৈরি এবং ম্যানেজমেন্ট সহজ করে।
- Concurrency Utilities
- Synchronization, Atomic Operations, এবং Locks।
- Concurrent Collections
- থ্রেড-সেফ ডেটা স্ট্রাকচার।
- Blocking Queues
- প্রোডিউসার-কনসিউমার প্যাটার্নে ব্যবহৃত হয়।
- Synchronizers
- Thread Coordination এবং Synchronization।
1. Executors এবং Thread Pools
Executors:
Executors API দিয়ে থ্রেড তৈরি এবং ম্যানেজ করা সহজ।
উদাহরণ:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorsExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " is executing task.");
};
for (int i = 0; i < 5; i++) {
executor.submit(task);
}
executor.shutdown();
}
}
Thread Pool Types:
newFixedThreadPool(int nThreads): নির্দিষ্ট সংখ্যক থ্রেড।newCachedThreadPool(): প্রয়োজন অনুযায়ী থ্রেড তৈরি।newSingleThreadExecutor(): একক থ্রেড।
2. Concurrency Utilities
Atomic Classes:
Atomic অপারেশন করার জন্য ব্যবহার হয়।
উদাহরণ:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
private static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) {
Runnable incrementTask = () -> {
for (int i = 0; i < 5; i++) {
System.out.println("Incremented: " + counter.incrementAndGet());
}
};
Thread t1 = new Thread(incrementTask);
Thread t2 = new Thread(incrementTask);
t1.start();
t2.start();
}
}
ReentrantLock:
মাল্টিথ্রেডেড প্রোগ্রামে লকিং।
উদাহরণ:
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Runnable task = () -> {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " is in critical section.");
} finally {
lock.unlock();
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
}
}
3. Concurrent Collections
ConcurrentHashMap:
থ্রেড-সেফ হ্যাশম্যাপ।
উদাহরণ:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.put("B", 2);
map.putIfAbsent("C", 3);
map.computeIfPresent("A", (key, val) -> val + 10);
System.out.println(map);
}
}
CopyOnWriteArrayList:
থ্রেড-সেফ ArrayList।
উদাহরণ:
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
for (String item : list) {
System.out.println(item);
}
}
}
4. Blocking Queues
ArrayBlockingQueue:
ফিক্সড সাইজের ব্লকিং কিউ।
LinkedBlockingQueue:
ডাইনামিক সাইজ ব্লকিং কিউ।
উদাহরণ:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) {
BlockingQueue<String> queue = new LinkedBlockingQueue<>();
Runnable producer = () -> {
try {
queue.put("Item1");
System.out.println("Produced: Item1");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable consumer = () -> {
try {
System.out.println("Consumed: " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(producer).start();
new Thread(consumer).start();
}
}
5. Synchronizers
CountDownLatch:
নির্দিষ্ট সংখ্যক থ্রেড শেষ হওয়ার অপেক্ষা।
উদাহরণ:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " finished task.");
latch.countDown();
};
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
latch.await();
System.out.println("All tasks finished.");
}
}
CyclicBarrier:
একসঙ্গে একাধিক থ্রেডের কাজ শুরু বা শেষ।
উদাহরণ:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All parties reached the barrier."));
Runnable task = () -> {
try {
System.out.println(Thread.currentThread().getName() + " is waiting at the barrier.");
barrier.await();
System.out.println(Thread.currentThread().getName() + " crossed the barrier.");
} catch (Exception e) {
e.printStackTrace();
}
};
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
}
}
Semaphore:
একসঙ্গে নির্দিষ্ট সংখ্যক থ্রেড রিসোর্সে অ্যাক্সেস।
java.util.concurrent প্যাকেজ মাল্টিথ্রেডেড প্রোগ্রামিংয়ের জন্য অত্যন্ত কার্যকরী। এটি থ্রেড ম্যানেজমেন্ট থেকে শুরু করে রিসোর্স শেয়ারিং, সিঙ্ক্রোনাইজেশন এবং ডেটা স্ট্রাকচারের নিরাপদ ব্যবস্থাপনা পর্যন্ত সবকিছু সহজ করে তোলে। সঠিক টুলসের ব্যবহার কনকারেন্সি সমস্যাগুলি সমাধান করতে সাহায্য করে এবং অ্যাপ্লিকেশনের কর্মক্ষমতা বাড়ায়।
Read more