Đa luồng (multithreading) là một khía cạnh quan trọng trong lập trình Java, cho phép chạy nhiều luồng đồng thời trong một ứng dụng. Điều này giúp tận dụng tối đa tài nguyên và cải thiện hiệu suất của ứng dụng. Dưới đây là một hướng dẫn về cách tạo và sử dụng đa luồng trong Java:
Tạo và chạy một luồng
Tạo một lớp con kế thừa từ lớp Thread
và ghi đè phương thức run()
.
Trong phương thức run()
, đặt các công việc mà luồng sẽ thực hiện.
Sử dụng phương thức start()
để khởi động luồng.
Ví dụ:
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
Sử dụng đa luồng trong Runnable
Tạo một lớp triển khai giao diện Runnable
và ghi đè phương thức run()
.
Tạo một đối tượng Thread
và truyền đối tượng Runnable
vào khi khởi tạo.
Sử dụng phương thức start()
để khởi động luồng.
Ví dụ:
class MyRunnable implements Runnable {
public void run() {
System.out.println("Runnable is running");
}
}
public class Main {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
Đồng bộ hóa và quản lý luồng
Sử dụng khối synchronized
để đồng bộ hóa truy cập vào các tài nguyên chia sẻ.
Sử dụng phương thức wait()
và notify()
để quản lý việc chờ đợi và thông báo giữa các luồng.
Ví dụ:
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
class MyThread extends Thread {
private Counter counter;
public MyThread(Counter counter) {
this.counter = counter;
}
public void run() {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
MyThread thread1 = new MyThread(counter);
MyThread thread2 = new MyThread(counter);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("Count: " + counter.getCount());
}
}
Xử lý các tình huống đặc biệt
Sử dụng phương thức sleep()
để tạm dừng một luồng trong một khoảng thời gian nhất định.
Sử dụng phương thức interrupt()
để ngắt một luồng đang chạy.
Sử dụng phương thức join()
để chờ cho đến khi một luồng kết thúc.
Ví dụ:
class MyThread extends Thread {
public void run() {
try {
System.out.println("Thread is running");
Thread.sleep(1000);
System.out.println("Thread is done");
} catch (InterruptedException e) {
System.out.println("Thread is interrupted");
}
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
thread.interrupt();
}
}
Trên đây là một số cách cơ bản để tạo và sử dụng đa luồng trong Java. Bằng cách sử dụng đa luồng, bạn có thể tận dụng tối đa sức mạnh của máy tính và cải thiện hiệu suất của ứng dụng. Tuy nhiên, cần lưu ý rằng việc làm việc với đa luồng cũng có thể phức tạp và đòi hỏi kiến thức về đồng bộ hóa và quản lý tài nguyên chia sẻ.