Tất Tần Tật Về Thread (Luồng) Trong Java Bạn Nên Biết

0
1244

Java, một trong những ngôn ngữ lập trình lâu đời và phổ biến nhất trên toàn thế giới, với sức mạnh vượt trội cũng như kho tài liệu hỗ trợ khổng lồ của mình, Java có thể giúp các lập trình viên làm hầu hết các công việc như lập trình web, lập trình game, lập trình ứng dụng di động, lập trình nhúng và hướng đối tượng…

Trong Java có rất nhiều thuật ngữ, rất nhiều hàm, rất nhiều function mà bạn phải đầu tư, nghiên cứu, học tập kỹ càng nếu như muốn làm chủ được nó. Và một trong số đó chính là Thread (luồng). Vậy Thread là gì, vòng đời của một Thread trong Java như thế nào?Các quyền ưu tiên trong Java? Các phương thức của lớp Thread và các khái niệm chủ yếu của Thread trong Java mà bạn nên biết ? Tất cả những phần này sẽ được chúng tôi phân tích trong bài viết dưới đây, hãy cùng nhau tìm hiểu nhé các bạn!

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

thread-trong-java
Thread trong Java

Thread hay còn gọi là luồng, là đơn vị nhỏ nhất trong Java, mỗi Thread sẽ thực hiện một công việc hoàn toàn riêng biệt và được quản lý bởi máy ảo Java (Java Virtual Machine). Java chính là một ngôn ngữ lập trình đa phân luồng (multithreaded). Thread kế thừa ý tưởng của đa nhiệm trong các ứng dụng để bạn có thể 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 (thread) riêng lẻ. Mỗi một thread có thể chạy song song riêng biệt với nhau.

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 một Thread đều có quyền ưu tiên nhất định để giúp cho hệ điều hành xác định chính xác thứ tự thread nào được xử lý trước, thread nào được xử lý sau. Các thread nào có quyền ưu tiên cao hơn, quan trọng hơn sẽ được hệ thống cấp phát bộ nhớ và thời gian để xử lý trước. Và trong Java, quyền ưu tiên này được thể hiện ở một dãy giữa Min-Priority (được xem là hằng số 1) và Max-Priority (hằng số 10). Và theo mặc định, mỗi một Thread sẽ được cung cấp một quyền ưu tiên Norm-Priority (hằng số 5).

Để có thể hiểu hơn về cách thức hoạt động của một thread trong Java như thế nào, các bạn hãy quan sát đoạn code sau, các thread này được tạo ra khi 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

Hy vọng những kiến thức trên sẽ giúp ích rất nhiều cho các bạn trong công việc, hãy học từng ngày, từng giờ, từng chút một, để có thể nắm vững tất cả những gì tinh túy nhất trong ngôn ngữ lập trình Java nhé. Chúc các bạn thành công!

Những kiến thức liên quan:

LEAVE A REPLY

Please enter your comment!
Please enter your name here