Tạo các Thread trong Java

Trong kiến trúc máy tính, đa luồng (Multithreading) là khả năng 1 đơn vị xử lý trung tâm hay 1 nhân trong bộ xử lý đa nhân có thể thực thi nhiều tiến trình (process) hay luồng (thread) đồng thời, được hỗ trợ bởi hệ điều hành. Trong đa luồng, các tiến trình và luồng xử lý phải chia sẻ tài nguyên với nhau.

1. Vòng đời của 1 thread:

1 thread sẽ đi qua nhiều trạng thái khác nhau trong vòng đời của nó. Biểu đồ bên dưới hiển thị cho chúng ta thấy vòng đời hoàn chỉnh của 1 thread.

Life cycle of a thread

Life cycle of a thread

Các trạng thái trong vòng đời của 1 thread bao gồm:

  • New: 1 thread bắt đầu vòng đời của nó ở trạng thái new. Nó giữ trạng thái này đến khi chương trình bắt đầu chạy thread đó.
  • Runnable: Sau khi được tạo, thread được chạy, lúc này thread trở thành runnable. Thread ở trong trạng thái này được xem xét để thực thi tác vụ của nó.
  • Waiting: Thỉnh thoảng, 1 thread chuyển sang trạng thái waiting trong khi nó đợi 1 thread khác để thực hiện 1 tác vụ. Thread này chuyển về trạng thái runnable chỉ khi thread kia ra tín hiệu cho thread đang chờ tiếp tục viêc thực thi.
  • Timed waiting: thread ở trạng thái runnable có thể chuyển sang trạng thái timed waiting cho 1 khoảng thời gian cụ thể. Thread trong trạng thái này trở lại trạng thái runnable khi khoảng thời gian trên hết hoặc khi 1 sự kiện nó đang đợi xảy ra.
  • Terminated: thread ở trạng thái runnable chuyển sang trạng thái terminated khi nó hoàn thành tác vụ của mình hoặc khi thread đó bị hủy.

2. Tạo các thread trong Java

Trong Java, chúng ta có 2 cách để có thể tạo ra các thread:

Cách 1: extend Thread class

class Runner extends Thread {
    private Thread t;
    private String threadName;

    public Runner(String name) {
        threadName = name;
        System.out.println("Creating " + threadName);
    }

    public void run() {
        System.out.println("Running " + threadName);
        try {
            for (int i = 4; i > 0; i--) {
                System.out.println("Thread: " + threadName + ", " + i);
                // Let the thread sleep for a while.
                Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            System.out.println("Thread " + threadName + " interrupted.");
        }
        System.out.println("Thread " + threadName + " exiting.");
    }

    public void start() {
        System.out.println("Starting " + threadName);
        if (t == null) {
            t = new Thread(this, threadName);
            t.start();
        }
    }
}

public class MultiThreads {
    public static void main(String[] args) {
        Runner t1 = new Runner("Thread 1");
        t1.start();
        Runner t2 = new Runner("Thread 2");
        t2.start();
    }
}

Kết quả:

Creating Thread 1
Creating Thread 2
Starting Thread 1
Starting Thread 2
Running Thread 1
Thread: Thread 1, 4
Running Thread 2
Thread: Thread 2, 4
Thread: Thread 1, 3
Thread: Thread 2, 3
Thread: Thread 1, 2
Thread: Thread 2, 2
Thread: Thread 1, 1
Thread: Thread 2, 1
Thread Thread 1 exiting.
Thread Thread 2 exiting.

Cách 2: Implements Runnable interface

class Runner implements Runnable {
    private Thread t;
    private String threadName;
    
    public Runner(String name) {
        threadName = name;
        System.out.println("Creating " + threadName);
    }

    public void run() {
        System.out.println("Running " + threadName);
        try {
            for (int i = 4; i > 0; i--) {
                System.out.println("Thread: " + threadName + ", " + i);
               // Let the thread sleep for a while.
               Thread.sleep(50);
            }
        } catch (InterruptedException e) {
            System.out.println("Thread " + threadName + " interrupted.");
        }
        System.out.println("Thread " + threadName + " exiting.");
    }

    public void start() {
        System.out.println("Starting " + threadName);
        if (t == null) {
            t = new Thread(this, threadName);
            t.start();
        }
    }
}

public class MultiThreads {
    public static void main(String[] args) {
        Runner t1 = new Runner("Thread 1");
        t1.start();
        Runner t2 = new Runner("Thread 2");        
        t2.start();
    }
}

Kết quả:

Creating Thread 1
Creating Thread 2
Starting Thread 1
Starting Thread 2
Running Thread 1
Thread: Thread 1, 4
Running Thread 2
Thread: Thread 2, 4
Thread: Thread 2, 3
Thread: Thread 1, 3
Thread: Thread 1, 2
Thread: Thread 2, 2
Thread: Thread 2, 1
Thread: Thread 1, 1
Thread Thread 2 exiting.
Thread Thread 1 exiting.

Như vậy là chúng ta đã tìm hiểu xong cách tạo các thread trong Java. Chúc các bạn thành công!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.