Chờ và Thông báo trong Java là gì?



Wait và Notify trong Java là hai phương thức cuối cùng cho phép các luồng giao tiếp với nhau. Bài viết này sẽ giúp bạn tìm hiểu chi tiết

tính năng trong Java cho phép thực hiện đồng thời hai hoặc nhiều phần của một chương trình. Mỗi phần là một Thread. Các luồng này thường phải phối hợp các hành động của chúng. Điều này được thực hiện bằng cách sử dụng một vài phương pháp cuối cùng như Chờ và Thông báo trong Java. Bài viết này sẽ giúp bạn hiểu chi tiết về các phương pháp này.

Tôi sẽ thảo luận các chủ đề theo thứ tự sau:





Hãy bắt đầu nào!

Đồng bộ hóa luồng là gì?

Các chương trình đa luồng có thể thường xuyên xảy ra tình trạng nhiều cố gắng truy cập cùng một nguồn tài nguyên tạo ra kết quả gian lận và đáng kinh ngạc. Đôi khi, nhiều luồng có thể cố gắng truy cập tài nguyên được chia sẻ, bạn cần đảm bảo rằng tài nguyên đó sẽ được sử dụng bởi chỉ một luồng tại một thời điểm. Điều này có thể được thực hiện bằng cách sử dụng Đồng bộ hóa trong Java.



Bây giờ nói về Polling. Thăm dò ý kiến ​​là một quá trình kiểm tra một điều kiện lặp đi lặp lại cho đến khi nó đúng. Phương pháp này được thực hiện với sự trợ giúp của để kiểm tra xem một điều kiện cụ thể có đúng hay không. Bạn có thể sử dụng phương pháp này cho các luồng nhưng phương pháp này lãng phí rất nhiều chu kỳ CPU và cũng làm cho quá trình thực hiện rất kém hiệu quả. Để tránh những loại lỗi này, các phương pháp như Chờ và Thông báo trong Java được giới thiệu.

Phương thức Wait () và Notify () là gì?

Để giải quyết vấn đề đa luồng, các phương pháp như Chờ và Thông báo trong được sử dụng. Lớp Object sử dụng ba phương thức cuối cùng này cho phép các luồng giao tiếp về trạng thái bị khóa của tài nguyên. Chúng còn được gọi là Khối được Bảo vệ.

trình duyệt db để đánh giá sqlite

Chờ đợi()

Phương thức này làm cho luồng đợi cho đến khi một luồng khác gọi các phương thức thông báo () và thông báoAll () cho đối tượng này. Phương thức Wait () này yêu cầu luồng đang gọi bỏ khóa và chuyển sang trạng thái ngủ cho đến khi một số luồng khác vào cùng một màn hình và gọi thông báo (). Phương thức này giải phóng khóa trước khi chờ đợi và yêu cầu lại khóa trước khi quay trở lại từ phương thức wait ().



Phương thức Wait () được tích hợp chặt chẽ với khóa đồng bộ hóa. Điều này được thực hiện bằng cách sử dụng một tính năng không có sẵn trực tiếp từ cơ chế đồng bộ hóa.

Cú pháp:

đã đồng bộ hóa (lockObject) {while (! condition) {lockObject.wait ()} // thực hiện hành động tại đây}

Chuỗi hiện tại phải sở hữu màn hình đối tượng của nó. Nó phải được gọi chỉ từ phương thức đã đồng bộ hóa, nếu không nó sẽ ném ra một ngoại lệ.

Thông báo ()

Phương pháp này được sử dụng để thông báo mà nó cần để hoạt động. Nó đánh thức một chuỗi được gọi là chờ đợi() trên cùng một đối tượng.

Lưu ý rằng gọi thông báo () cuối cùng không từ bỏ một khóa. Nó nói với một chuỗi đang chờ rằng nó có thể thức dậy. Tuy nhiên, khóa không thực sự được từ bỏ cho đến khi quá trình đồng bộ hóa của trình thông báo hoàn tất. Bây giờ hãy nói, nếu bạn gọi thông báo () trên một tài nguyên nhưng trình thông báo vẫn cần thực hiện các hành động trong 10 giây trong khối được đồng bộ hóa của nó, tiểu trình đã chờ đợi sẽ phải đợi thêm ít nhất 10 giây nữa để trình thông báo giải phóng khóa trên đối tượng, mặc dù thông báo () đã được gọi.

Cú pháp:

đã đồng bộ hóa (lockObject) {// setting_the_condition lockObject.notify () // bất kỳ mã bổ sung nào nếu cần}

NotifyAll ()

Phương thức này được sử dụng để đánh thức tất cả các luồng đã gọi là wait () trên cùng một đối tượng. Luồng ưu tiên cao nhất sẽ chạy trước trong hầu hết các trường hợp mặc dù nó không được đảm bảo. Những thứ khác tương tự như phương thức thông báo ().

Tại sao và cách sử dụng Wait () và Notify () trong Java?

Bạn nên sử dụng Chờ và Thông báo trong bởi vì chúng liên quan đến khóa và đối tượng có khóa. Mặc dù chờ và thông báo trong Java là một khái niệm khá cơ bản, chúng được định nghĩa trong lớp đối tượng . Đáng ngạc nhiên là không dễ dàng để viết mã bằng cách sử dụng chờ và thông báo. Bạn có thể kiểm tra điều này bằng cách viết mã để giải quyết vấn đề của nhà sản xuất-người tiêu dùng bằng cách sử dụng chờ và thông báo. Ví dụ về người tiêu dùng của nhà sản xuất-Chờ và Thông báo trong Java-EdurekaĐây, tôi có một chia sẻ Xếp hànghai chủ đềgọi là Người sản xuất Khách hàng . Người sản xuất luồng đặt số vào một hàng đợi được chia sẻ và Khách hàng luồng tiêu thụ các số từ nhóm được chia sẻ.

Điều kiện là một khi một mặt hàng được sản xuất, chuỗi người tiêu dùng phải được thông báo và tương tự, sau khi chuỗi nhà sản xuất tiêu thụ cần được thông báo. Chuỗi liên kết nàygiao tiếpđạt được bằng cách sử dụng chờ và thông báo trong Java.

Ghi chú : W.ait và Nocác phương thức tify được định nghĩa trong lớp đối tượngvà chúng phải được gọi bên trong khối đồng bộ.

Thí dụ

public class Thread1 {public static void main (String [] args) {Thread2 b = new Thread2 () b.start () sync (b) {try {System.out.println ('Đang đợi 2 kết thúc ...' ) b.wait ()} catch (InterruptException e) {e.printStackTrace ()} System.out.println ('Total is:' + b.total)}}} lớp Thread2 mở rộng Thread1 {int total @Override public void run () {sync (this) {for (int i = 0 i<=100 i++) { total += i } notify() }}}

Lưu ý rằng trong ví dụ trên, một đối tượng của Thread2, đó là b, được đồng bộ hóa. B này hoàn thành phép tính trước khi luồng Chính xuất ra tổng giá trị của nó.

Đầu ra:

Điều này đưa chúng ta đến phần cuối của bài viết này, nơi chúng ta đã học được trên Chờ và Thông báo trong Java.Tôi hy vọng nội dung được đề cập ở trên sẽ hữu ích trong việc nâng cao hiểu biết. Tiếp tục đọc, tiếp tục khám phá!

Cũng kiểm tra của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java. Khóa học được thiết kế để cung cấp cho bạn khởi đầu về lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với nhiều như Hibernate & Spring.