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 ครับ