Java Threads là gì? – Các nguyên tắc cơ bản của Đa luồng

Java Threads là gì? Bạn đã biết hết về khái niệm Java Threads chưa? Hãy cùng tìm hiểu bài viết dưới đây để nắm bắt toàn bộ kiến thức về nguyên tắc đa luồng trong ngôn ngữ Java. Nếu là một lập trình viên thì chắc chắn bạn không thể bỏ qua bài viết này. Cùng tìm hiểu thôi!

Mục lục bài viết

Java Threads là gì?

Một luồng là việc thực thi một tập hợp nhỏ các lệnh được quản lý độc lập bởi bộ lập lịch của hệ điều hành. Java hỗ trợ đa luồng, có nghĩa là một chương trình đơn giản được chia thành nhiều phần và mọi phần được thực thi đồng thời.

Các bộ phận được mô hình hóa sao cho không ảnh hưởng đến hoạt động của các bộ phận khác. Nó mở rộng tính năng đa nhiệm trong đó ứng dụng được chia nhỏ thành các hoạt động được gọi là luồng. Các luồng này chạy song song với nhau. Hệ điều hành lập lịch thời gian xử lý của mỗi luồng.

  • Mới: Vòng đời của luồng mới bắt đầu ở trạng thái mới và vẫn ở trạng thái đó cho đến khi một chương trình gọi phương thức chạy.
  • Runnable: trạng thái thực thi của luồng. Chủ đề được cho là ở trạng thái có thể chạy được.
  • Đang chờ: Luồng được cho là ở trạng thái chờ khi nó chờ thực thi của luồng khác để thực hiện tác vụ cụ thể. Luồng lại có thể rơi vào trạng thái chạy được khi một chương trình yêu cầu nó.
  • Thời gian chờ: Một luồng có thể chạy đi vào trạng thái chờ trong khoảng thời gian cụ thể và sau đó nó có thể chuyển trở lại trạng thái thực thi sau một khoảng thời gian chờ được chỉ định.
  • Đã kết thúc: Khi nhiệm vụ luồng được hoàn thành theo yêu cầu, nó sẽ bị kết thúc. Tuy nhiên, luồng không thể chuyển trở lại trạng thái chạy được từ trạng thái này.
Java-Threads-la-gi
Java Threads là gì?

Vì các luồng chạy song song với nhau, nên hệ điều hành phải đặt mức độ ưu tiên của các luồng để xác định thứ tự thực hiện luồng. Mức độ ưu tiên của chuỗi nằm trong phạm vi từ một (MIN_PRIORITY) đến mười (MAX_PRIORITY). Theo mặc định, ưu tiên luồng được đưa ra bởi NORM_PRIORITY (giá trị năm). Luồng có mức độ ưu tiên cao hơn được thực thi trước vì chúng được cấp phát bộ xử lý trước.

Chủ đề được tạo theo hai cách:

  • Giao diện Runnable
  • Mở rộng lớp chủ đề

Triển khai giao diện Runnable

Bước 1: Đầu tiên thực hiện phương thức run () do giao diện Runnable đưa ra. Phương thức run () là điểm vào của một luồng và logic hoàn chỉnh được đặt bên trong hàm này.

public void run ()

Bước 2: Khởi tạo đối tượng Thread.

Chủ đề (Runnable obj, String threadNam);

“Obj” là trường hợp của lớp chính.

Bước 3: Sau khi tạo một đối tượng luồng, bạn có thể gọi phương thức start () mà lần lượt gọi phương thức run () để chạy luồng.

void start ()

Ví dụ sử dụng giao diện Runnable

class RunnableDem implements Runnable
{
private Thread t1;
private String threadNam;
RunnableDem( String name)
{
threadNam = name;
System.out.println("Thread Creating " +  threadNam );
}
public void run() {
System.out.println("Thread Running " +  threadNam );
try
{
for(int x = 4; x> 0; x--)
{
System.out.println("Thread: " + threadNam + ", " + x);
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println(" Intruppted Thread " +  threadNam + " interrupted.");
}
System.out.println("Thread " +  threadNam + " exit.");
}
public void start ()
{
System.out.println("Starting " +  threadNam );
if (t1 == null)
{
t1= new Thread (this, threadNam);// New Thread is created
t1.start ();//run method is called
}
}
}
public class TestThread {
public static void main(String args[])
{
RunnableDem run1 = new RunnableDem( "Thread_1");//Object of Class is created
run1.start();//Start method is called
RunnableDem run2= new RunnableDem( "Thread_2"); // 2nd Object is  created
run2.start(); // start method is called
}
}

Trong phương thức chính, đối tượng của lớp được tạo gọi phương thức bắt đầu của giao diện Runnable. Trong phương thức Start cùng với định nghĩa Java Threads là gì có một luồng mới được tạo và phương thức run () được gọi để thực thi luồng.

Cách mở rộng lớp chủ đề

class ThreadDemo extends Thread  //Thread class  is extended
{
private Thread t;
private String threadNam;
 
ThreadDemo( String name)   /// Default Constructor of the Class
{
threadNam = name;
System.out.println("Thread Creating " +  threadNam );
}
public void run()  // Thread execution starts
{
System.out.println("Thread Running " +  threadNam );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadNam + ", " + i);
Thread.sleep(50);// Sleep  method takes the thread in time waiting state for 50 seconds
}
} catch (InterruptedException e) {
System.out.println("Thread " +  threadNam + " interrupted.");
}
System.out.println("Thread " +  threadNam + " exit.");
}
public void start ()
{
System.out.println("Thread Starting " +  threadNam );
if (t == null)
{
t = new Thread (this, threadNam);// thread is created
t.start ();
}
}
}
class TestThread {
public static void main(String args[]) {
ThreadDemo t11 = new ThreadDemo( "Thread_1");//Class object is created and Thread name is passed as arguments
t11.start();
ThreadDemo t21 = new ThreadDemo( "Thread_2");
t21.start();
}
}

Output

Thread Creating Thread_1

Thread Starting Thread_1

Thread Creating Thread_2

Thread Starting Thread_2

Thread Running Thread_1

Thread: Thread-1, 4

Thread 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 exit.

Thread Thread_2 exit.

Đối tượng được tạo trong phương thức chính của lớp và phương thức bắt đầu được gọi. Phương thức Start tạo một luồng và gọi phương thức Run để thực thi luồng dựa trên định nghĩa Java Threads là gì.

Kiểm soát luồng

Java cung cấp một cách kiểm soát các luồng trong chương trình. Một chương trình đa luồng có thể được xây dựng có thể dừng, tiếp tục hoặc tạm ngừng các luồng. Sau đây là danh sách các phương pháp:

  • Public void pause (): Tạm dừng trạng thái hiện tại của luồng có thể được tiếp tục.
  • Public void stop (): Dừng hoàn toàn chuỗi
  • Public void resume (): Tiếp tục chuỗi bị tạm ngưng
  • Public void wait (): Làm cho chuỗi chờ cho đến khi phương thức thông báo () được gọi
  • Công khai void thông báo (): Đánh thức luồng khỏi trạng thái chờ.

Ví dụ:

public class Thread2 implements Runnable
{
Thread t1;
int Count1;
boolean suspend=false;
public void run()
{
if(suspended)
t.resume();
else
t.suspend();
suspended = !suspended;
return true;
}
...
}

Khi phương thức stop () kết thúc quá trình thực thi của luồng, ngay cả phương thức start () cũng không thể khởi động nó, vì vậy phương thức sleep () được sử dụng thay vì nó để tạm dừng thực thi luồng trong một thời gian.

Đây không phải là một thực tiễn tốt vì chuỗi sẽ không khả dụng trong khoảng thời gian đó. Phương thức Susan () được sử dụng để tạm dừng việc thực thi luồng và phương thức resume () làm cho luồng bị treo chạy lại.

Tổng kết

Hy vọng với những kiến thức vừa được chia sẻ trong bài viết về khái niệm Java Threads là gì đã giúp bạn hiểu rõ hơn về nguyên tắc cơ bản đa luồng. Bỏ túi ngay cho mình thêm nhiều kiến thức học Java về đa dạng các ngôn ngữ lập trình trên Box.edu.vn nhé! Chúc bạn thành công!

5/5 - (5 bình chọn)
Xin chào các bạn! Mình là Hà Nguyên Phương Hiện đang là tác giả của Box.edu.vn website nổi tiếng chuyên review, đánh giá, giới thiệu các khóa học hay nhất hiện nay.