Java Multithreading: Thread, Runnable, ExecutorService

#java13 เม.ย. 2569

Multithreading คืออะไร

Multithreading ช่วยให้โปรแกรมทำงานหลายอย่างพร้อมกัน เพิ่ม performance สำหรับ CPU-intensive หรือ I/O-intensive tasks

สร้าง Thread

// วิธีที่ 1: extends Thread
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread: " + Thread.currentThread().getName());
    }
}

MyThread t = new MyThread();
t.start();

// วิธีที่ 2: implements Runnable
Runnable task = () -> {
    System.out.println("Runnable: " + Thread.currentThread().getName());
};

Thread thread = new Thread(task);
thread.start();

ExecutorService

import java.util.concurrent.*;

// Fixed thread pool
ExecutorService executor = Executors.newFixedThreadPool(4);

for (int i = 0; i < 10; i++) {
    final int taskId = i;
    executor.submit(() -> {
        System.out.println("Task " + taskId + " by " + Thread.currentThread().getName());
    });
}

executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES);

Callable และ Future

ExecutorService executor = Executors.newFixedThreadPool(2);

Callable<Integer> task = () -> {
    Thread.sleep(1000);
    return 42;
};

Future<Integer> future = executor.submit(task);

// ทำงานอื่นระหว่างรอ
System.out.println("กำลังรอผลลัพธ์...");

Integer result = future.get();  // block จนกว่าจะเสร็จ
System.out.println("ผลลัพธ์: " + result);

Synchronization

public class Counter {
    private int count = 0;

    // synchronized method
    public synchronized void increment() {
        count++;
    }

    // synchronized block
    public void decrement() {
        synchronized (this) {
            count--;
        }
    }

    public int getCount() { return count; }
}

// AtomicInteger - thread-safe ไม่ต้อง synchronized
import java.util.concurrent.atomic.AtomicInteger;
AtomicInteger atomicCount = new AtomicInteger(0);
atomicCount.incrementAndGet();

ConcurrentCollections

// Thread-safe collections
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();
List<String> copyOnWriteList = new CopyOnWriteArrayList<>();
Queue<String> blockingQueue = new LinkedBlockingQueue<>();

ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

// รันหลัง 5 วินาที
scheduler.schedule(() -> System.out.println("Delayed!"), 5, TimeUnit.SECONDS);

// รันทุก 1 วินาที
scheduler.scheduleAtFixedRate(
    () -> System.out.println("Periodic!"),
    0, 1, TimeUnit.SECONDS
);

สรุป

Multithreading ใน Java มีหลายระดับ ตั้งแต่ Thread พื้นฐาน ไปจนถึง ExecutorService ที่จัดการ thread pool ให้ ควรใช้ ExecutorService แทน Thread โดยตรงในงาน production ครับ