Java
2024-04-15
30 phút đọc
Multithreading trong Java: Từ Thread cơ bản đến ExecutorService
Multithreading trong Java: Từ Thread cơ bản đến ExecutorService
Multithreading cho phép chương trình tận dụng tốt hơn tài nguyên CPU, nhưng cũng mang lại nhiều rủi ro: deadlock, race condition, starvation...
1. Tạo Thread theo cách truyền thống
Có hai cách phổ biến:
- Kế thừa từ
Thread. - Implement interface
RunnablehoặcCallable.
class MyTask implements Runnable {
@Override
public void run() {
System.out.println("Running in " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
Thread t = new Thread(new MyTask());
t.start();
}
}
2. Vấn đề với việc tạo quá nhiều Thread
Mỗi Thread truyền thống tốn nhiều bộ nhớ và chi phí context switch cao. Nếu bạn tạo hàng ngàn Thread cùng lúc, hệ thống sẽ trở nên rất chậm dù CPU chưa dùng hết.
3. ExecutorService – Quản lý Thread đúng cách
Thay vì tự tạo và hủy Thread, hãy sử dụng ExecutorService để tái sử dụng Thread:
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
int index = i;
executor.submit(() -> {
System.out.println("Task " + index + " in " + Thread.currentThread().getName());
});
}
executor.shutdown();
4. Một chút về đồng bộ hóa (synchronization)
Khi nhiều Thread cùng truy cập và ghi dữ liệu chung, bạn cần cơ chế đồng bộ:
synchronizedLock(ReentrantLock)- Các cấu trúc an toàn luồng như
ConcurrentHashMap,BlockingQueue...
Ví dụ đơn giản với synchronized:
public class Counter {
private int value = 0;
public synchronized void increment() {
value++;
}
public synchronized int get() {
return value;
}
}
Bước đầu nắm Multithreading là hiểu cách tạo Thread, dùng ExecutorService hợp lý và bảo vệ dữ liệu chia sẻ bằng các cơ chế đồng bộ hóa phù hợp.