Sự khác biệt chính - ngủ và chờ trong Java
Ngủ và chờ là hai phương pháp được sử dụng để đa luồng trong Java. Phương thức sleep thuộc lớp Thread trong khi phương thức wait thuộc lớp Object. Sự khác biệt chính giữa chế độ ngủ và chờ trong Java là, chế độ ngủ được sử dụng để tạm ngừng thực thi luồng hiện tại trong số phần nghìn giây được chỉ định trong khi phương thức chờ được sử dụng để khiến luồng hiện tại đợi cho đến khi luồng khác gọi thông báo hoặc Phương thứctifyAll 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. Đề có trọng lượng nhẹ. Đa luồng là cơ chế chạy nhiều luồng cùng một lúc. Các ngôn ngữ lập trình như Java hỗ trợ đa luồng. Đa luồng có ưu điểm vì nó cho phép chạy đồng thời nhiều luồng và các luồng độc lập với nhau. Có những phương thức trong Java có thể được sử dụng cho đa luồng. Hai người trong số họ đang ngủ và chờ đợi.
Sleep trong Java là gì?
Có nhiều quy trình đang chạy trong một hệ điều hành. Tiến trình là một chương trình đang được thực thi. Mỗi tiến trình có thể có nhiều luồng và có một sự 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 triển khai giao diện Runnable. Lớp Thread có các hàm tạo và 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 Đối tượng và triển khai giao diện Runnable. Giao diện Runnable nên được triển khai bởi bất kỳ lớp nào có các cá thể được dự định thực thi bởi một luồng. Khi luồng thực thi, mã sẽ thực thi được viết bên trong phương thức run. Luồng sẽ chạy được chọn bởi bộ lập lịch luồng. Chỉ một chuỗi chạy trong một quy 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, người lập trình 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 bắt đầu được gọi, thì luồng đó ở trạng thái chạy được. Sau khi bộ lập lịch luồng chọn luồng để thực thi, nó sẽ chuyển sang trạng thái đang 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 chạy được hoặc bị chặn. Sau khi hoàn thành phương thức chạy, luồng chuyển sang trạng thái kết thúc. Đó là các giai đoạn chính của vòng đời chuỗi.
Có nhiều phương thức khác nhau 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 cho phương thức sleep là public void sleep (dài mili giây) ném InterruptException. Nó làm cho luồng đang thực thi tạm thời dừng thực thi trong một số mili giây được chỉ định. Nếu một chuỗi khác làm gián đoạn chuỗi hiện tại, trạng thái bị gián đoạn của chuỗi hiện tại sẽ bị xóa khi ngoại lệ này được ném ra.
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ỉ một luồng thực thi tại một thời điểm. Với Chủ đề.ngủ (1000); sẽ cho phép luồng đầu tiên kết thúc quá trình thực thi trong 1000 mili giây. Khi một chuỗi đang ở chế độ ngủ, bộ lập lịch chuỗi sẽ chọn chuỗi khác.
Chờ đợi trong Java là gì?
Nhiều chủ đề có thể truy cập vào một tài nguyên được chia sẻ. Nó có thể tạo ra một đầu ra không chính xác. Đồng bộ hóa luồng có thể được sử dụng để thực hiện chỉ 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 các giá trị vào một tệp văn bản có tên là Text1.txt. Các giá trị đó sẽ được sử dụng cho một số phép tính khác khi t1 trả về. Nếu t2 bắt đầu trước khi t1 quay trở lại, 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 một đầ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, vì vậy chỉ có t1 mới 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 nhiệm vụ hoàn thành t1 có thể nhả khóa. Khóa còn được gọi là màn hình.
Có thể đạt được đồng bộ hóa luồng bằng giao tiếp giữa các luồng. 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 bị 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 các phương thức wait, thông báo và thông báoAll. Chúng thuộc về lớp Đối tượng. 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 thông báo hoặc thông báoAll cho đối tượng. Phương thức thông báo được sử dụng để đánh thức một luồng duy nhất đang chờ khóa. Thông báoAll đánh thức tất cả các chuỗi đang chờ khóa.
Hình 02: Lớp Máy tính
Hình 03: Phương pháp chính
Lớp Máy tính mở rộng Chủ đề. Khối được đồng bộ hóa nằm bên trong phương thức chạy. Vòng lặp for và phương thức thông báo nằm bên 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 bắt đầu được gọi trên thể hiện đó. Phương thức chính sẽ đợi cho đến khi luồng đưa ra thông báo. Khi thực thi chương trình, phương thức main đợi cho đến khi thực hiện toàn bộ phương thức chạy và đợi 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ã. Main đang đợi cho đến khi luồng Máy tính hoàn thành. Cuối cùng, kết quả của tổng được in ra.
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 phải đợi chuỗi khác hoàn thành.
Máy tính t1=Máy tính mới ();
t1. start ();
System.out.println (t1.sum);
Điểm giống nhau giữa ngủ và chờ trong Java là gì?
Cả sleep và wait đều 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 ngủ và chờ trong Java là gì?
ngủ và chờ trong Java |
|
Phương thức ngủ khiến luồng hiện tại tạm ngừng thực thi trong một số mili giây được chỉ định, tùy thuộc vào độ chính xác và độ chính xác của bộ hẹn giờ và bộ lập lịch hệ thống. | Phương thức chờ làm cho luồng hiện tại đợi cho đến khi luồng khác gọi phương thức thông báo hoặc thông báoAll cho đối tượng. |
Liên kết với Khóa | |
Phương thức ngủ không mở khóa trên một đối tượng trong khi đồng bộ hóa. | Phương pháp 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 | |
Sleep là một phương thức của lớp Thread. | Chờ là một phương thức của lớp Đối tượng. |
Hoàn | |
Quá trình ngủ hoàn tất sau khi hết khoảng thời gian quy định. | Phương thức chờ bị gián đoạn khi gọi phương thức thông báo hoặc thông báoAll. |
Tóm tắt - ngủ và chờ trong Java
Có nhiều tiến trình đang chạy trên hệ điều hành. Mỗi quy trình có thể có nhiều luồng. Một luồng là đơn vị xử lý nhỏ nhất trong 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 đồng thời. Ngủ và chờ 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 sleep và wait trong Java là, sleep được sử dụng để tạm ngừng thực thi luồng hiện tại trong số phần nghìn giây được chỉ định trong khi phương thức chờ được sử dụng để khiến luồng hiện tại đợi 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.