Trong Java, quản lý luồng (thread) là một phần quan trọng trong lập trình đa nhiệm. Khi làm việc với luồng, bạn sẽ gặp hai phương thức chính là start()run(). Dù có vẻ tương tự nhưng chúng có các chức năng và cách sử dụng khác nhau. Bài viết này sẽ giúp bạn hiểu rõ sự khác biệt giữa Thread.start()Thread.run().

1. Định nghĩa

Thread.run()

  • Định nghĩa: Phương thức run() chứa mã sẽ được thực thi khi một luồng chạy. Đây là nơi bạn đặt logic mà bạn muốn thực hiện trong luồng.
  • Cách sử dụng: Phương thức run() có thể được gọi trực tiếp, nhưng nếu bạn gọi trực tiếp, mã bên trong run() sẽ chạy trên luồng hiện tại thay vì trên một luồng mới.

Thread.start()

  • Định nghĩa: Phương thức start() được sử dụng để khởi động một luồng mới. Khi bạn gọi start(), nó sẽ tạo ra một luồng mới và sau đó gọi phương thức run() trong luồng đó.
  • Cách sử dụng: Bạn gọi start() trên một đối tượng của lớp Thread (hoặc lớp con của Thread), và nó sẽ thực hiện các bước cần thiết để tạo và bắt đầu một luồng mới.

2. Sự khác biệt chính

2.1. Tạo và khởi động luồng

  • Thread.run(): Khi bạn gọi run(), mã trong phương thức này sẽ được thực thi trong luồng hiện tại, không tạo ra luồng mới. Điều này có thể gây nhầm lẫn vì bạn có thể nghĩ rằng mã đang chạy trong một luồng riêng biệt.
  • Thread.start(): Khi bạn gọi start(), nó sẽ khởi tạo một luồng mới và sau đó gọi run() trong luồng đó. Điều này có nghĩa là mã trong run() sẽ chạy song song với các luồng khác.

2.2. Hành vi

  • Thread.run(): Khi bạn gọi run() trực tiếp, không có luồng mới được tạo ra và tất cả mã sẽ chạy như một phương thức bình thường.
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.run(); // Chạy trong luồng chính
    }
}
  • Thread.start(): Gọi start() sẽ tạo ra một luồng mới và chạy mã trong run() trong luồng đó.
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(); // Chạy trong một luồng mới
    }
}

2.3. Quản lý trạng thái

  • Thread.run(): Không thay đổi trạng thái của đối tượng luồng. Bạn sẽ không thấy bất kỳ thay đổi nào trong trạng thái của luồng khi gọi run().
  • Thread.start(): Khi gọi start(), trạng thái của luồng sẽ chuyển từ NEW sang RUNNABLE. Luồng sẽ sau đó chạy và có thể chuyển sang các trạng thái khác như BLOCKED, WAITING, hoặc TERMINATED.

3. Kết luận

Sự khác biệt giữa Thread.start()Thread.run() trong Java rất rõ ràng. Gọi run() sẽ thực thi mã trong luồng hiện tại mà không tạo ra luồng mới, trong khi gọi start() sẽ khởi động một luồng mới và sau đó gọi run() trong luồng đó. Để tận dụng tối đa khả năng của lập trình đa nhiệm trong Java, bạn nên sử dụng start() để tạo và khởi động các luồng mới thay vì gọi trực tiếp run().