Sự khác biệt giữa giấc ngủ và chờ đợi trong Java

Sự khác biệt chính - ngủ vs chờ trong Java
 

Ngủ và chờ là hai phương thức được sử dụng cho đa luồng trong Java. Phương thức ngủ thuộc về lớp Thread trong khi phương thức chờ là từ lớp Object. Các sự khác biệt chính giữa giấc ngủ và chờ đợi trong Java là thế, chế độ ngủ được sử dụng để tạm dừng việc thực hiện luồng hiện tại trong số mili giây đã chỉ định trong khi phương thức chờ được sử dụng để khiến luồng hiện tại chờ cho đến khi luồng khác gọi phương thức thông báo hoặc notifyAll cho đối tượng.

Một luồng là đơn vị xử lý nhỏ nhất trong hệ điều hành. Nó là một luồng điều khiển tuần tự duy nhất trong một chương trình. Chủ đề rất nhẹ. Đa luồng là cơ chế chạy nhiều luồng cùng lúc. Các ngôn ngữ lập trình như Java hỗ trợ đa luồng. Đa luồng có lợi thế vì nó cho phép chạy nhiều luồng đồng thời và các luồng độc lập với nhau. Có các phương thức trong Java có thể được sử dụng cho đa luồng. Hai trong số họ đang ngủ và chờ đợi.

NỘI DUNG

1. Tổng quan và sự khác biệt chính
2. Ngủ trong Java là gì
3. Chờ đợi trong Java là gì
4. Điểm tương đồng giữa giấc ngủ và chờ đợi trong Java
5. So sánh cạnh nhau - ngủ và chờ trong Java ở dạng bảng
6. Tóm tắt

Ngủ trong Java là gì?

Có nhiều quy trình đang chạy trong một hệ điều hành. Một quá trình là một chương trình trong thực thi. Mỗi quá trình có thể có nhiều luồng và có một chuyển đổi ngữ cảnh xảy ra giữa các luồng này. Trong Java, có hai cách để tạo một luồng. Đó là bằng cách mở rộng lớp luồng hoặc bằng cách thực hiện giao diện Runnable. Lớp Thread có các hàm tạo và các phương thức để tạo và thực hiện các hoạt động trên một luồng. Lớp Thread mở rộng lớp Object và thực hiện giao diện Runnable. Giao diện Runnable nên được thực hiện bởi bất kỳ lớp nào có phiên bản dự định được thực thi bởi một luồng. Khi luồng thực thi, mã cần thực thi được ghi bên trong phương thức chạy. Các luồng nên chạy được chọn bởi bộ lập lịch luồng. Chỉ có một luồng chạy trong một tiến trình duy nhất.

Một chủ đề trải qua nhiều giai đoạn. Sau khi tạo một đối tượng của lớp Thread, lập trình viên có thể gọi phương thức start. Trước khi gọi phương thức đó, luồng được cho là ở trạng thái mới. Bộ lập lịch luồng chọn một luồng để chạy. Nếu luồng chưa được chọn bởi bộ lập lịch luồng nhưng nếu phương thức start được gọi, thì luồng ở trạng thái runnable. Sau khi bộ lập lịch luồng chọn luồng để thực thi, nó chuyển sang trạng thái chạy. Nếu luồng còn sống nhưng hiện không đủ điều kiện để chạy, thì nó ở trạng thái không thể chạy hoặc bị chặn. Sau khi hoàn thành phương thức chạy, luồng sẽ chuyển sang trạng thái kết thúc. Đó là các giai đoạn chính của vòng đời luồng.

Có nhiều phương thức có sẵn trong lớp luồng để thực hiện các tác vụ khác nhau. Phương pháp ngủ được sử dụng để ngủ phương pháp trong một khoảng thời gian cụ thể. Cú pháp của phương thức ngủ là công khai void ngủ (mili giây dài) ném InterruptedException. Nó làm cho luồng hiện đang thực thi dừng thực thi tạm thời trong một số mili giây đã chỉ định. Nếu một luồng khác làm gián đoạn luồng hiện tại, trạng thái bị gián đoạn của luồng hiện tại sẽ bị xóa khi ngoại lệ này được ném.

Hình 01: Chương trình Java với phương thức ngủ

Theo chương trình trên, phương thức chạy chứa mã cần được thực thi. Trong chương trình chính, hai đối tượng của exampleThread1 được tạo và các phương thức bắt đầu được gọi trên chúng. Điều đó sẽ cho phép chạy mã bên trong phương thức chạy. Chỉ có một luồng thực hiện tại một thời điểm. Với chủ đề. ngủ (1000); sẽ cho phép luồng đầu tiên chấm dứt thực thi trong 1000 mili giây. Khi một luồng đang ngủ, bộ lập lịch xử lý sẽ lấy ra các luồng khác.

Chờ gì trong Java?

Nhiều luồng có thể truy cập vào một tài nguyên được chia sẻ. Nó có thể gây ra một đầu ra không chính xác. Đồng bộ hóa luồng có thể được sử dụng để chỉ tạo một luồng để truy cập tài nguyên được chia sẻ. Giả sử một tình huống như sau. Nếu, có hai luồng là t1 và t2, t1 bắt đầu lưu giá trị vào tệp văn bản có tên là Text1.txt. Những giá trị này sẽ được sử dụng cho một số tính toán khác khi t1 trả về. Nếu t2 bắt đầu trước khi t1 trả về, t2 có thể thay đổi các giá trị được lưu bởi t1. Điều này có thể khiến t1 cung cấp đầu ra sai. Với sự trợ giúp của đồng bộ hóa, khi t1 bắt đầu sử dụng tệp Text1.txt, tệp đó có thể bị khóa, do đó t1 chỉ có thể truy cập được. T2 không thể thay đổi nó cho đến khi t1 giải phóng khóa để truy cập tệp văn bản đó. Khi tác vụ hoàn thành, t1 có thể giải phóng khóa. Khóa còn được gọi là màn hình.

Đồng bộ hóa luồng có thể đạt được bằng giao tiếp giữa các luồng. Một phần quan trọng là một đoạn mã truy cập các tài nguyên được chia sẻ. Trong giao tiếp giữa các luồng, một luồng được tạm dừng chạy trong phần quan trọng của nó và một luồng khác được phép nhập vào cùng một phần quan trọng sẽ được thực thi. Nó được thực hiện bằng cách sử dụng chờ, thông báo và thông báo cho tất cả các phương thức. Chúng thuộc lớp Object. Phương thức chờ được sử dụng để cho phép luồng hiện tại giải phóng khóa và đợi cho đến khi luồng khác gọi phương thức notify hoặc notifyAll cho đối tượng. Phương thức thông báo được sử dụng để đánh thức một chuỗi đang chờ khóa. Thông báo Tất cả đánh thức tất cả các chủ đề đang chờ trên khóa.

Hình 02: Lớp Máy tính

Hình 03: Phương thức chính

Lớp Máy tính mở rộng Chủ đề. Khối đồng bộ nằm trong phương thức chạy. Phương thức lặp và thông báo nằm trong khối được đồng bộ hóa. Bên trong phương thức chính, một thể hiện của một luồng được tạo và phương thức start được gọi trong thể hiện đó. Phương thức chính sẽ đợi cho đến khi chủ đề đưa ra thông báo. Khi thực hiện chương trình, phương thức chính sẽ đợi cho đến khi thực hiện toàn bộ phương thức chạy và chờ phương thức thông báo. Khi phương thức thông báo được gọi, phương thức chính dừng chờ và bắt đầu thực thi phần còn lại của mã. Chính đang chờ cho đến khi chủ đề Máy tính được hoàn thành. Cuối cùng, kết quả của tổng được in.

Nếu không có khối được đồng bộ hóa và nếu phương thức chính có mã như bên dưới, nó sẽ cho đầu ra là 0 vì nó không đợi luồng khác hoàn thành.

Máy tính t1 = Máy tính mới ();

 t1. khởi đầu ();

System.out.println (t1.sum);

Sự giống nhau giữa giấc ngủ và chờ đợi trong Java?

  • Cả ngủ và chờ là các phương thức có thể được sử dụng khi triển khai đa luồng trong Java

Sự khác biệt giữa giấc ngủ và chờ đợi trong Java?

ngủ vs chờ trong Java

Phương thức ngủ làm cho luồng hiện tại tạm dừng thực thi đối với số mili giây đã chỉ định, tùy thuộc vào độ chính xác và chính xác của bộ định thời và bộ lập lịch hệ thống. Phương thức chờ làm cho luồng hiện tại chờ cho đến khi một luồng khác gọi phương thức notify hoặc notifyAll cho đối tượng.
 Hiệp hội với khóa
Phương thức ngủ không giải phóng khóa trên một đối tượng trong khi đồng bộ hóa. Phương thức chờ giải phóng khóa trong khi đồng bộ hóa.
Phương pháp thực hiện
Phương thức ngủ được thực thi trên luồng hiện tại. Phương thức chờ được gọi trên đối tượng.
 Lớp liên kết
Giấc ngủ là một phương thức của lớp Thread. Chờ đợi là một phương thức của lớp Object.
Hoàn thành
Quá trình ngủ được hoàn thành sau khi hết thời gian quy định. Phương thức chờ bị gián đoạn bằng cách gọi các phương thức thông báo hoặc thông báoTất cả.

Tóm lược - ngủ vs chờ trong Java

Có nhiều quy trình đang chạy trên hệ điều hành. Mỗi quá trình có thể có nhiều chủ đề. Một luồng là đơn vị xử lý nhỏ nhất trong một hệ điều hành. Ngôn ngữ lập trình Java hỗ trợ đa luồng. Nó cho phép chạy nhiều luồng cùng một lúc. Ngủ và chờ đợi là hai phương pháp có thể được sử dụng khi thực hiện đa luồng. Sự khác biệt giữa ngủ và chờ trong Java là, chế độ ngủ được sử dụng để tạm dừng thực thi luồng hiện tại cho số mili giây đã chỉ định trong khi phương thức chờ được sử dụng để khiến luồng hiện tại chờ cho đến khi luồng khác gọi thông báo hoặc thông báo phương thức cho đối tượng.

Tài liệu tham khảo:

1. Giao tiếp liên chủ đề trong Java - Javatpoint.. JavaTPoint. Có sẵn ở đây
2. Chủ đề liên Giao tiếp trong đa luồng Java | Hướng dẫn cốt lõi Java | Học tập. Có sẵn ở đây