Thứ Tư, 27 tháng 2, 2019

Đào tạo java - Java - Đa luồng

Khóa đào tạo Java là ngôn ngữ lập trình đa luồng , có nghĩa là chúng ta có thể phát triển chương trình đa luồng bằng Java.

Một chương trình đa luồng chứa hai hoặc nhiều phần có thể chạy đồng thời và mỗi phần có thể xử lý một tác vụ khác nhau đồng thời sử dụng tối ưu các tài nguyên có sẵn đặc biệt khi máy tính của bạn có nhiều CPU.

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

Theo định nghĩa, đa nhiệm là khi nhiều quy trình chia sẻ các tài nguyên xử lý chung như CPU. Đa luồng mở rộng ý tưởng đa nhiệm vào các ứng dụng trong đó bạn có thể chia các hoạt động cụ thể trong một ứng dụng thành các luồng riêng lẻ.

Mỗi luồng có thể chạy song song. HĐH phân chia thời gian xử lý không chỉ giữa các ứng dụng khác nhau, mà còn giữa từng luồng trong một ứng dụng Khóa đào tạo Java.

Đa luồng cho phép bạn viết theo cách mà nhiều hoạt động có thể tiến hành đồng thời trong cùng một chương trình.

Vòng đời của một chủ đề


Một chủ đề trải qua các giai đoạn khác nhau trong vòng đời của nó. Ví dụ, một chủ đề được sinh ra, bắt đầu, chạy và sau đó chết. Sơ đồ sau đây cho thấy vòng đời hoàn chỉnh của một luồng.

Sau đây là các giai đoạn của vòng đời


Mới - Một luồng mới bắt đầu vòng đời của nó ở trạng thái mới. Nó vẫn ở trạng thái này cho đến khi chương trình bắt đầu chuỗi. Nó cũng được gọi là một chủ đề sinh ra .

Runnable - Sau khi một chủ đề mới được bắt đầu, chủ đề sẽ trở thành runnable. Một chủ đề trong trạng thái này được coi là thực hiện nhiệm vụ của nó.

Chờ đợi - Đôi khi, một luồng chuyển sang trạng thái chờ trong khi luồng chờ một luồng khác thực hiện một tác vụ. Một luồng chuyển đổi trở lại trạng thái có thể chạy chỉ khi một luồng khác báo hiệu luồng chờ để tiếp tục thực thi.

Thời gian chờ đợi - Một chuỗi có thể chạy có thể vào trạng thái chờ được hẹn giờ trong một khoảng thời gian xác định. Một luồng trong trạng thái này chuyển trở lại trạng thái có thể chạy khi khoảng thời gian đó hết hạn hoặc khi sự kiện nó đang chờ xảy ra.

Đã kết thúc (Chết) - Một chuỗi có thể chạy vào trạng thái kết thúc khi nó hoàn thành nhiệm vụ hoặc kết thúc.

Ưu tiên chủ đề


Mỗi luồng Khóa đào tạo Java có mức độ ưu tiên giúp hệ điều hành xác định thứ tự các luồng được lên lịch.

Các ưu tiên của luồng Java nằm trong phạm vi giữa MIN_PRIORITY (hằng số là 1) và MAX_PRIORITY (hằng số là 10). Theo mặc định, mọi luồng được ưu tiên NORM_PRIORITY (hằng số là 5).

Các luồng có mức độ ưu tiên cao hơn quan trọng hơn đối với chương trình và nên được phân bổ thời gian xử lý trước các luồng có mức độ ưu tiên thấp hơn. Tuy nhiên, các ưu tiên của luồng không thể đảm bảo thứ tự thực hiện các luồng và phụ thuộc rất nhiều vào nền tảng.

Tạo một chủ đề bằng cách triển khai một giao diện có thể chạy

Nếu lớp của bạn dự định được thực thi như một luồng thì bạn có thể đạt được điều này bằng cách thực hiện giao diện Runnable . Bạn sẽ cần phải làm theo ba bước cơ bản -

Bước 1

Bước đầu tiên, bạn cần triển khai phương thức run () được cung cấp bởi giao diện Runnable . Phương thức này cung cấp một điểm vào cho luồng và bạn sẽ đặt logic nghiệp vụ hoàn chỉnh của mình vào bên trong phương thức này. Sau đây là một cú pháp đơn giản của phương thức run ()

public void run( )

Bước 2

Bước thứ hai, bạn sẽ khởi tạo một đối tượng Thread bằng cách sử dụng hàm tạo sau

Thread(Runnable threadObj, String threadName); 

Trong đó, threadObj là một thể hiện của một lớp thực hiện giao diện Runnable và threadName là tên được đặt cho luồng mới.

Bước 3

Khi một đối tượng Thread được tạo, bạn có thể khởi động nó bằng cách gọi phương thức start () , thực thi một phương thức gọi để chạy (). Sau đây là một cú pháp đơn giản của phương thức start ()

void start();

Dưới đây là một ví dụ tạo ra một chủ đề mới và bắt đầu chạy nó
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);
            // 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 TestThread {

   public static void main(String args[]) {
      RunnableDemo R1 = new RunnableDemo( "Thread-1");
      R1.start();
      
      RunnableDemo R2 = new RunnableDemo( "Thread-2");
      R2.start();
   }   
}
Creating Thread-1
Starting Thread-1
Creating Thread-2
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.

Tạo một chủ đề bằng cách mở rộng một lớp chủ đề

Cách thứ hai để tạo một luồng là tạo một lớp mới mở rộng lớp Thread bằng hai bước đơn giản sau. Cách tiếp cận này cung cấp sự linh hoạt hơn trong việc xử lý nhiều luồng được tạo bằng các phương thức có sẵn trong lớp Thread.

Bước 1

Bạn sẽ cần ghi đè phương thức run () có sẵn trong lớp Thread. Phương thức này cung cấp một điểm vào cho luồng và Khóa đào tạo Java sẽ đặt logic nghiệp vụ hoàn chỉnh của mình vào bên trong phương thức này. Sau đây là một cú pháp đơn giản của phương thức run () -
public void run( )

Bước 2

Khi đối tượng Thread được tạo, bạn có thể khởi động nó bằng cách gọi phương thức start () , thực thi một phương thức gọi để chạy (). Sau đây là một cú pháp đơn giản của phương thức start ()
void start( );

Creating Thread-1
Starting Thread-1
Creating Thread-2
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.

Phương pháp chủ đề

Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp Thread.

Sr.Không.Phương pháp & Mô tả
1khoảng trống công khai bắt đầu ()

Bắt đầu luồng trong một đường dẫn thực hiện riêng biệt, sau đó gọi phương thức run () trên đối tượng Thread này.
2công khai void run ()

Nếu đối tượng Thread này được khởi tạo bằng cách sử dụng một mục tiêu Runnable riêng biệt, phương thức run () được gọi trên đối tượng Runnable đó.
3chung kết void setName (Tên chuỗi)

Thay đổi tên của đối tượng Thread. Ngoài ra còn có một phương thức getName () để lấy tên.
4chung kết void setP Warriority (ưu tiên int)
Đặt mức độ ưu tiên của đối tượng Thread này. Các giá trị có thể nằm trong khoảng từ 1 đến 10.
5chung kết void setDaemon (boolean on)
Một tham số của true biểu thị Chủ đề này là một chủ đề daemon.
6chung cuộc void void tham gia (millisec dài)
Chuỗi hiện tại gọi phương thức này trên luồng thứ hai, khiến luồng hiện tại bị chặn cho đến khi luồng thứ hai kết thúc hoặc số mili giây được chỉ định đi qua.
7ngắt khoảng trống công cộng ()
Làm gián đoạn luồng này, khiến nó tiếp tục thực thi nếu nó bị chặn vì bất kỳ lý do nào.
số 8boolean cuối cùng công khai isAlive ()

Trả về true nếu luồng còn sống, đó là bất cứ lúc nào sau khi luồng được bắt đầu nhưng trước khi nó chạy đến khi hoàn thành.
Các phương thức trước được gọi trên một đối tượng Thread cụ thể. Các phương thức sau trong lớp Thread là tĩnh. Gọi một trong các phương thức tĩnh thực hiện thao tác trên luồng hiện đang chạy.

Sr.Không.Phương pháp & Mô tả
1năng suất void static static ()

Làm cho luồng hiện đang chạy mang lại bất kỳ luồng nào có cùng mức độ ưu tiên đang chờ được lên lịch.
2ngủ tĩnh công cộng (millisec dài)
Làm cho luồng hiện đang chạy bị chặn ít nhất là số mili giây đã chỉ định.
3boolean tĩnh giữ khóa (Object x)
Trả về true nếu luồng hiện tại giữ khóa trên Object đã cho.
4công tĩnh Chủ đề currentThread ()
Trả về một tham chiếu đến luồng hiện đang chạy, đó là luồng gọi phương thức này.
5công khai void voidStStack ()
In theo dõi ngăn xếp cho luồng hiện đang chạy, rất hữu ích khi gỡ lỗi một ứng dụng đa luồng.
Chương trình ThreadClassDemo sau đây trình bày một số phương thức của lớp Thread. Hãy xem xét một lớp DisplayMessage thực hiện Runnable

Sau đây là chương trình chính, sử dụng các lớp được xác định ở trên
// File Name : ThreadClassDemo.java
public class ThreadClassDemo {

   public static void main(String [] args) {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
      
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();

      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try {
         thread3.join();
      } catch (InterruptedException e) {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
      
      thread4.start();
      System.out.println("main() is ending...");
   }
}
Điều này sẽ tạo ra kết quả sau đây. Bạn có thể thử lại ví dụ này nhiều lần và bạn sẽ nhận được một kết quả khác nhau mỗi lần.

Đầu ra
Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......

Các khái niệm đa luồng Khóa đào tạo Java chính

Trong khi thực hiện lập trình Đa luồng trong Java, bạn sẽ cần phải có các khái niệm sau đây rất tiện dụng

Đồng bộ hóa chủ đề là gì?

Xử lý liên lạc giữa các bên

Xử lý bế tắc luồng

Hoạt động chủ đề chính

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...