Quay lại danh sách
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:

  1. Kế thừa từ Thread.
  2. Implement interface Runnable hoặc Callable.
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ộ:

  • synchronized
  • Lock (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.