Lớp Thread
(Class Thread)

Lớp Thread đại diện cho một luồng thực thi trong một chương trình Java. Một ứng dụng Java có thể có nhiều luồng thực thi đồng thời. Mỗi luồng có một mức ưu tiên. Các luồng có ưu tiên cao hơn sẽ được ưu tiên thực thi so với các luồng có ưu tiên thấp hơn. Mỗi luồng có thể được đánh dấu là một daemon hoặc không. Khi một luồng tạo ra một đối tượng Thread mới, luồng mới sẽ có mức ưu tiên ban đầu bằng với mức ưu tiên của luồng tạo ra nó và là một daemon nếu và chỉ khi luồng tạo ra nó là một daemon.

Khi một Máy ảo Java khởi động, thường có một luồng không phải daemon duy nhất (thường gọi phương thức có tên main của một lớp được chỉ định). Máy ảo Java tiếp tục thực thi các luồng cho đến khi một trong hai điều kiện sau xảy ra:

Phương thức exit của lớp Runtime đã được gọi và trình quản lý bảo mật cho phép hoạt động thoát diễn ra.

Tất cả các luồng không phải daemon đã chết, hoặc bằng cách trả về từ cuộc gọi đến phương thức run hoặc bằng cách ném một ngoại lệ lan truyền ngoài phương thức run.

Khai báo lớp Thread trong Java

Khi sử dụng lớp Thread trong Java, bạn không cần phải import bất kỳ lớp nào vì Thread là một phần của gói java.lang. Gói này được tự động import vào tất cả các chương trình Java, do đó, bạn có thể sử dụng lớp Thread mà không cần bất kỳ câu lệnh import nào.

Cú pháp khai báo lớp Thread:

Cú pháp

public class Thread
  extends Object
  implements Runnable

Dưới đây là giải thích chi tiết về cú pháp khai báo này:

↳ public class Thread: Đây là khai báo một lớp công khai (public) tên là Thread. Lớp này có thể được truy cập từ bất kỳ đâu trong dự án Java, miễn là nó được import hoặc ở cùng gói.

↳ extends Object: Lớp Thread kế thừa từ lớp Object. Trong Java, tất cả các lớp đều ngầm định kế thừa từ Object nếu không kế thừa từ lớp khác, bởi vì Object là lớp cha của tất cả các lớp trong Java. Điều này có nghĩa là lớp Thread có tất cả các phương thức và thuộc tính của lớp Object.

↳ implements Runnable: Lớp Thread thực hiện (implements) giao diện Runnable. Giao diện Runnable chỉ định rằng lớp Thread phải cung cấp một phương thức run(). Giao diện này là nền tảng của việc thực thi đa luồng trong Java.

Điều này có nghĩa là lớp Thread có khả năng chạy một khối mã trong một luồng riêng biệt. Khi bạn tạo một đối tượng Thread và gọi phương thức start() trên đối tượng đó, nó sẽ thực thi phương thức run() trong một luồng riêng biệt.

Các lớp lồng của lớp Thread

Lớp Thread trong Java cung cấp hai lớp lồng để quản lý vòng đời và xử lý ngoại lệ của các luồng:

↳ static class Thread.State là một lớp con của lớp Thread, nó đại diện cho trạng thái hiện tại của một luồng (ví dụ: đang chạy, đang ngủ, bị tạm dừng).

↳ static interface Thread.UncaughtExceptionHandler là một giao diện con của lớp Thread, nó định nghĩa một phương thức để xử lý các ngoại lệ không được bắt trong một luồng.

Các trường tĩnh của lớp Thread

Lớp Thread trong Java định nghĩa 3 hằng số tĩnh để đại diện cho các mức ưu tiên của luồng:

↳ Thread.MAX_PRIORITY: Giá trị là 10, đại diện cho mức ưu tiên cao nhất của một luồng.

↳ Thread.MIN_PRIORITY: Giá trị là 1, đại diện cho mức ưu tiên thấp nhất của một luồng.

↳ Thread.NORM_PRIORITY: Giá trị là 5, đại diện cho mức ưu tiên mặc định của một luồng.

Các hằng số này được sử dụng để thiết lập mức ưu tiên cho một luồng bằng phương thức setPriority(int newPriority).

Các constructor của lớp Thread

Lớp Thread cung cấp nhiều constructor để tạo ra các đối tượng luồng với các thông tin khác nhau:

↳ Thread(): Tạo một đối tượng luồng mới.

↳ Thread(Runnable target): Tạo một đối tượng luồng mới với đối tượng Runnable được chỉ định.

↳ Thread(Runnable target, String name): Tạo một đối tượng luồng mới với đối tượng Runnable và tên được chỉ định.

↳ Thread(String name): Tạo một đối tượng luồng mới với tên được chỉ định.

↳ Thread(ThreadGroup group, Runnable target): Tạo một đối tượng luồng mới thuộc nhóm luồng được chỉ định và với đối tượng Runnable được chỉ định.

↳ Thread(ThreadGroup group, Runnable target, String name): Tạo một đối tượng luồng mới thuộc nhóm luồng được chỉ định, với đối tượng Runnable và tên được chỉ định.

↳ Thread(ThreadGroup group, Runnable target, String name, long stackSize): Tạo một đối tượng luồng mới thuộc nhóm luồng được chỉ định, với đối tượng Runnable, tên và kích thước stack được chỉ định.

↳ Thread(ThreadGroup group, String name): Tạo một đối tượng luồng mới thuộc nhóm luồng được chỉ định và với tên được chỉ định.

Các phương thức của lớp Thread

Lớp Thread trong Java cung cấp các phương thức để quản lý và truy cập thông tin về luồng. Dưới đây là danh sách tất cả các phương thức của lớp Thread trong Java:

Phương thức tạo và khởi động một luồng

Phương thứcMô tả
void run()Phương thức này được gọi khi luồng bắt đầu thực thi. Nếu luồng được tạo từ một đối tượng Runnable, thì phương thức run() của đối tượng đó sẽ được gọi, ngược lại, phương thức này sẽ không làm gì.
void start()Khởi động luồng, bắt đầu thực thi phương thức run().

Phương thức tạm dừng luồng

Phương thứcMô tả
static void sleep(long millis)Làm cho luồng hiện tại tạm dừng thực thi trong một khoảng thời gian nhất định, tính bằng mili giây.
static void sleep(long millis, int nanos)Làm cho luồng hiện tại tạm dừng thực thi trong một khoảng thời gian nhất định, tính bằng mili giây và nano giây được chỉ định.

Phương thức ngắt luồng

Phương thứcMô tả
void interrupt()Ngắt luồng hiện tại.
boolean isInterrupted() Kiểm tra xem luồng hiện tại có bị ngắt hay không. Không xóa trạng thái ngắt, nghĩa là có thể kiểm tra nhiều lần mà không làm mất thông tin.
static boolean interrupted()Kiểm tra xem luồng hiện tại có bị ngắt hay không. Nếu luồng đang bị ngắt, phương thức này sẽ xóa trạng thái ngắt (clear interrupt flag), nghĩa là lần sau gọi lại sẽ trả về false trừ khi nó lại bị ngắt lần nữa.

Phương thức chờ luồng

Phương thứcMô tả
void join()Chờ cho luồng hiện tại kết thúc trước khi tiếp tục thực thi.
void join(long millis)Chờ luồng hiện tại kết thúc tối đa millis mili giây.
void join(long millis, int nanos)Chờ luồng hiện tại kết thúc tối đa millis mili giây và nanos nano giây.

Phương thức đặt tên cho luồng

Phương thứcMô tả
String getName()Trả về tên của luồng.
void setName(String name)Đặt tên cho luồng.

Phương thức thiết lập mức độ ưu tiên của lớp thread

Phương thứcMô tả
void setPriority(int newPriority)Thiết lập mức ưu tiên cho luồng.
int getPriority()Trả về mức ưu tiên của luồng hiện tại.

Phương thức liên quan đến luồng daemon của lớp thread

Phương thứcMô tả
void setDaemon(boolean on)Phương thức này được sử dụng để đánh dấu luồng hiện tại là luồng daemon hoặc không phải là luồng daemon. Nếu tham số on là true, luồng được đánh dấu là luồng daemon. Ngược lại, nếu on là false, luồng không phải là luồng daemon.
boolean isDaemon()Kiểm tra xem luồng là daemon hay không.

Phương thức tĩnh của lớp thread

Phương thứcMô tả
static int activeCount()Trả về số lượng luồng đang hoạt động trong nhóm luồng hiện tại và các nhóm con của nó.
static Thread currentThread()Trả về đối tượng Thread đại diện cho luồng đang thực thi hiện tại.
static void dumpStack()In ra thông tin về stack trace của luồng hiện tại ra màn hình console.
static int enumerate(Thread[] tarray)Sao chép các luồng đang hoạt động trong nhóm luồng hiện tại và các nhóm con của nó vào mảng tarray đã cho.
static Map<Thread, StackTraceElement[]> getAllStackTraces()Trả về một Map chứa thông tin stack trace của tất cả các luồng đang sống.
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()Trả về trình xử lý mặc định cho ngoại lệ không được bắt trong một luồng.

Phương thức lấy thông tin của lớp thread

Phương thứcMô tả
long getId()Trả về một số định danh duy nhất của luồng.
StackTraceElement[] getStackTrace()Trả về một mảng các đối tượng StackTraceElement đại diện cho stack trace của luồng hiện tại.
Thread.State getState()Trả về trạng thái hiện tại của luồng (NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED).
ThreadGroup getThreadGroup()Trả về nhóm luồng mà luồng này thuộc về.
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()Trả về trình xử lý ngoại lệ không được bắt cho luồng này.
String toString()Trả về một chuỗi biểu diễn thông tin về luồng.

Phương thức kiểm tra trạng thái của lớp thread

Phương thứcMô tả
boolean isAlive()Kiểm tra xem luồng còn sống hay không.
void setContextClassLoader(ClassLoader cl)Thiết lập ClassLoader cho luồng hiện tại.
void checkAccess()Kiểm tra xem luồng hiện tại có quyền sửa đổi luồng này hay không.

Phương thức xử lý ngoại lệ

Phương thứcMô tả
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)Thiết lập trình xử lý ngoại lệ cho luồng hiện tại.
Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()Trả về trình xử lý ngoại lệ mặc định cho tất cả các luồng.

Phương thức không được hỗ trợ

Phương thứcMô tả
protected Object clone()Không được phép clone một đối tượng Thread vì mỗi luồng phải có một danh tính duy nhất.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”