Latest Post

Tăng thứ hạng và truy cập tự nhiên với 10 phương pháp SEO hay nhất Kiếm Tiền Online (mmo): Khái Niệm và Các Hình Thức Phổ Biến

Java, một trong những ngôn ngữ lập trình phổ biến và lâu đời nhất trên thế giới, mang lại sức mạnh và kho tài liệu hỗ trợ lớn, cho phép lập trình viên thực hiện nhiều công việc như lập trình web, game, ứng dụng di động, nhúng và hướng đối tượng.

Trong hệ sinh thái phong phú của Java, Thread (luồng) đóng một vai trò quan trọng. Để hiểu rõ về Thread trong Java, chúng ta cần tìm hiểu về vòng đời của một Thread, quyền ưu tiên, các phương thức của lớp Thread, và các khái niệm quan trọng khác liên quan đến việc quản lý luồng. Hãy khám phá chi tiết trong bài viết dưới đây để có cái nhìn tổng quan về quản lý luồng trong lập trình Java.

Định nghĩa về Thread trong Java?

thread-trong-java

Thread trong Java

Thread, hay được gọi là luồng, đó là đơn vị nhỏ nhất trong ngôn ngữ lập trình Java. Mỗi thread thực hiện một công việc độc lập và được quản lý bởi máy ảo Java (Java Virtual Machine).

Java là một ngôn ngữ lập trình đa luồng (multithreaded). Thread thừa kế khái niệm đa nhiệm trong ứng dụng, cho phép chia nhỏ các hoạt động riêng biệt bên trong một ứng dụng đơn thành các luồng riêng lẻ. Mỗi thread có thể chạy đồng thời và độc lập với các thread khác.

Vòng đời của một Thread trong ngôn ngữ lập trình Java.

vong-doi-thread-trong-java
Vòng đời của Thread trong Java
Mỗi một Thread đều đi qua các giai đoạn khác nhau, nó được sinh ra, bắt đầu, chạy và sẽ tự động hủy ngay sau đó. Một vòng đời của Thread được biểu diễn qua sơ đồ sau đây: Chúng ta cùng nhau quan sát và giải thích một số khái niệm có trong sơ đồ này nhé!
  • New: Đây là trạng thái đầu tiên của một Thread khi mới bắt đầu vòng đời của nó. Trạng thái này tồn tại cho tới khi chương trình bắt đầu chạy. 
  • Runnable: Khi một Thread được sinh và và bắt đầu chạy, nó sẽ trở thành runnable. Và ở trong trạng thái này, nó được xem như đang thực hiện tác vụ của chính mình.
  • Waiting: Đôi khi, một thread sẽ ở trong trạng thái waiting (chờ đợi) để một thread khác thực hiện một tác vụ nào đó.  Và nó sẽ tự động chuyển về trạng thái runnable chỉ khi thread khác ra hiệu. Và sau khi thread kia thực hiện xong tác vụ của mình, nó sẽ tự động khởi tạo và thực hiện nhiệm vụ của mình.
  • Timed waiting: Một thread trong trạng thái runnable có thể chuyển thành trạng thái timed waiting trong một khoảng thời gian nào đó. Thời gian này ngắn hay dài tùy thuộc vào tốc độ xử lý của thread trước đó.
  • Terminated: Một thread trong trạng thái runnable có thể đi vào trạng thái terminated khi nó đã hoàn thành xong tất cả các tác vụ của nó.

Các quyền ưu tiên của Thread trong Java

Mỗi thread trong hệ thống có một mức ưu tiên nhất định, giúp hệ điều hành quyết định thứ tự xử lý chính xác giữa các thread. Các thread với mức ưu tiên cao sẽ được ưu tiên hơn trong việc cấp phát tài nguyên và thời gian xử lý.

Trong Java, mức ưu tiên của mỗi thread được biểu diễn trong một khoảng giữa Min-Priority (được đại diện bằng hằng số 1) và Max-Priority (được biểu diễn bằng hằng số 10). Mặc định, mỗi thread được gán mức ưu tiên là Norm-Priority (hằng số 5).

Để hiểu rõ hơn về cách một thread hoạt động trong Java, chúng ta có thể xem xét đoạn mã dưới đây, trong đó các thread được tạo bằng cách triển khai Runnable Interface trong Java.

class RunnableDemo implements Runnable {

   private Thread t;

   private String threadName;   

   RunnableDemo( 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);

            // De thread ngung trong choc lat.

            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 TestThread {

   public static void main(String args[]) {   

      RunnableDemo R1 = new RunnableDemo( “Thread-1”);

      R1.start();

      

      RunnableDemo R2 = new RunnableDemo( “Thread-2”);

      R2.start();

   }   

}

Một số phương thức quan trọng có sẵn trong lớp Thread của ngôn ngữ Java

  • public void start(): Bắt đầu thread trong một path riêng rẽ, sau đó triệu hồi phương thức run() trên đối tượng Thread này
  • public void run(): Nếu đối tượng Thread này được khởi tạo bởi sử dụng một đối tượng Runnable, phương thức run() sẽ được triệu hồi 
  • public final void setName(String name): Thay đổi tên của đối tượng Thread. Cũng có một phương thức getName() để thu nhận tên này
  • public final void setPriority(int priority): Thiết lập quyền ưu tiên của đối tượng Thread này. Giá trị có thể có nằm trong khoảng từ 1 tới 10
  • public final void setDaemon(boolean in): Một tham số true chứng tỏ Thread này như là một Daemon thread
  • public final void join(long millis): Thread hiện tại triệu hồi phương thức này trên thread thứ hai, làm cho Thread hiện tại block tới khi thread thứ hai kết thúc hoặc sau một số lượng mili giây đã xác định
  • public void interrupt(): Ngắt thread này, làm cho nó tiếp tục thực thi nếu nó bị block vì bất cứ lý do gì
  • public final boolean isAlive(): Trả về true nếu thread này là alive, mà là bất cứ thời gian nào sau khi thread này đã được bắt đầu nhưng trước khi nó run tới khi kết thúc
  • public static void yield(): Làm cho thread đang chạy hiện tại chuyển tới bất kỳ thread nào khác có cùng quyền ưu tiên mà đang đợi để được ghi lịch trình
  • public static void sleep(long millis): Làm cho thread đang chạy hiện tại block trong ít nhất một số lượng mili giây đã xác định
  • public static boolean holdsLock(Object x): Trả về true nếu thread giữ lock trên Object đã cho
  • public static Thread currentThread(): Trả về một tham chiếu tới thread đang chạy hiện tại, mà là thread mà triệu hồi phương thức này
  • public static void dumpStack(): In ra stack trace cho thread đang chạy hiện tại. Nó rất hữu ích khi debugging một ứng dụng đa luồng

Để nắm rõ và sử dụng thành thạo tất cả các phương thức này trong Java, chắc chắn các bạn phải thực hành thật nhiều, tìm hiểu kỹ cách thức hoạt động để sử dụng chính xác từng phương thức trong từng trường hợp cụ thể.

Quả thật không đơn giản chút nào phải không các bạn. Và ở phần cuối cùng của bài viết này, chúng tôi xin chia sẻ một số khái niệm về Thread trong Java, đây chỉ là những đề mục khái niệm cơ bản, còn đi sâu nghiên cứu về những khái niệm này, sẽ có một bài viết khác phân tích chi tiết hơn nhé.

Một số khái niệm về Thread trong Java

  • Thread Synchronization trong Java
  • Inter Thread Communication trong Java
  • Thread deadlock trong Java
  • Thread Control trong Java

Mong rằng những thông tin trên sẽ mang lại lợi ích lớn cho các bạn trong quá trình làm việc. Hãy chấp nhận học hỏi mỗi ngày, mỗi giờ, từng chút một, để có thể hiểu rõ và sử dụng thành thạo mọi khía cạnh quan trọng của ngôn ngữ lập trình Java. Chúc các bạn đạt được thành công trong hành trình của mình!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *