JavaRush /Blog Java /Random-VI /Cấp độ 25. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ...
zor07
Mức độ
Санкт-Петербург

Cấp độ 25. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ

Xuất bản trong nhóm
Cấp độ 25. Trả lời câu hỏi phỏng vấn về chủ đề cấp độ - 1
  1. Tất cả các trạng thái của đối tượng là gì Thread?

    • MỚI
    • CÓ THỂ CHẠY ĐƯỢC
    • ĐÃ CHẶN
    • CHỜ
    • TIMED_WAITING
    • ĐÃ KẾT THÚC
  2. Một thread có thể chuyển sang trạng thái nào khi vào một khối synchronized?

    • CÓ THỂ CHẠY ĐƯỢC
    • ĐÃ CHẶN

    Trong RUNNABLE, nếu khối mã được đánh dấu synchronizedkhông bị chiếm bởi luồng khác. Nếu không, luồng của chúng ta sẽ nhận trạng thái BLOCKED và sẽ đợi đối tượng mutex được giải phóng.

  3. Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức wait()?

    Việc gọi phương thức này sẽ đặt luồng ở trạng thái WAITING.
    Phương thức này wait()chỉ có thể được gọi bên trong một khối synchronizedtrên đối tượng mutex đã bị “khóa” bởi luồng hiện tại, nếu không phương thức sẽ ném ra một ngoại lệ IllegalMonitorStateException .

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    Khi một phương thức được gọi wait(), luồng hiện tại sẽ giải phóng khóa khỏi đối tượng monitorvà chuyển sang trạng thái WAITING, chờ phương thức được gọi monitor.notify()bởi monitor.notifyAll()một luồng khác. Ngay khi điều này xảy ra, luồng sẽ thức dậy và nếu màn hình không bận, nó sẽ lấy nó và tiếp tục hoạt động.
    Nếu màn hình bị chiếm bởi một luồng khác, luồng hiện tại sẽ chuyển sang trạng thái BLOCKED.

  4. Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức wait(500)?

    Việc gọi phương thức này sẽ đặt luồng ở trạng thái TIMED_WAITING.
    Bằng cách tương tự với phương thức wait(), wait(timeout)nó chỉ có thể được gọi bên trong một khối synchronizedtrên đối tượng mutex đã bị “khóa (khóa)” bởi luồng hiện tại.

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait(500);}

    Khi gọi phương thức wait(), luồng hiện tại sẽ giải phóng khóa khỏi đối tượng monitorvà chuyển sang chế độ ngủ trong 500 mili giây. Đối tượng monitorcó thể bị bắt bởi một luồng khác.
    Sau 500 mili giây, luồng sẽ thức dậy và nếu monitornó không bận, nó sẽ lấy nó và tiếp tục hoạt động.
    Nếu màn hình bị chiếm bởi một luồng khác, luồng hiện tại sẽ chuyển sang trạng thái BLOCKED.

    Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức notify()?

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    Sau monitor.wait(), thread sẽ chuyển sang trạng thái WAITING. Một phương thức notify()được gọi bởi một luồng khác trên một đối tượng monitorsẽ di chuyển luồng từ trạng thái CHỜ sang trạng thái CHẠY trừ khi đối tượng giám sát bị một luồng khác bắt giữ, nếu không thì chuyển sang trạng thái BLOCKED.

  5. Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức notifyAll()?

    notifyAll()"sẽ ở lại" tất cả các chủ đề. Một trong tất cả các luồng "ngủ" (CHỜ) sẽ chuyển sang trạng thái RUNNABLE, chiếm quyền giám sát đối tượng đang được sử dụng và tiếp tục công việc của nó. Phần còn lại sẽ ở trạng thái BLOCKED. Ngay sau khi luồng “đánh thức” đầu tiên nhả màn hình mà mọi người khác đang chờ đợi, số phận của nó sẽ được lặp lại bởi luồng tiếp theo (một luồng tùy ý sẽ chuyển từ trạng thái BLOCKED sang trạng thái RUNNABLE). Điều này sẽ tiếp tục cho đến khi tất cả các luồng "được đánh thức" rời khỏi trạng thái BLOCKED.

  6. Ba luồng trong khối được đồng bộ hóa được gọi là wait()đối tượng mutex. Các luồng này sẽ chuyển sang trạng thái nào nếu luồng thứ tư gọi notifyAll()?

    Hai trong số chúng sẽ chuyển sang trạng thái BLOCKED, một vào trạng thái RUNNABLE

  7. Nó khác join(500)với thế nào wait(500)?

    Mặc dù thực tế là nó join(500)sẽ wait(500)chuyển luồng hiện tại sang trạng thái TIMED_WAITING, nhưng có những khác biệt đáng kể giữa chúng:
    join(500)được gọi trên một luồng, wait(500)được gọi bên trong một khối được đồng bộ hóa trên đối tượng mà khối này được đồng bộ hóa.
    Khi được gọi, join(500)luồng hiện tại sẽ đợi 500 mili giây để luồng có phương thức join()được gọi hoàn thành.
    Khi được gọi, wait(500)luồng hiện tại sẽ giải phóng khóa khỏi đối tượng được đồng bộ hóa và chuyển sang chế độ ngủ trong 500 mili giây.
    Sau 500 mili giây, trong cả hai trường hợp, luồng sẽ tiếp tục hoạt động.

  8. Nó khác wait(500)với thế nào sleep(500)?

    sleep(500)được gọi trên một luồng, wait(500)được gọi bên trong một khối được đồng bộ hóa trên đối tượng mà khối này được đồng bộ hóa.
    Khi được gọi, sleep(500)luồng hiện tại sẽ đợi 500 mili giây, sau đó tiếp tục công việc của nó.
    Khi được gọi, wait(500)luồng hiện tại sẽ giải phóng khóa khỏi đối tượng được đồng bộ hóa và chuyển sang chế độ ngủ trong 500 mili giây.

  9. Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức yield()?

    Khi một phương thức được gọi yield(), luồng hiện tại “bỏ lượt” và java ngay lập tức chuyển sang thực thi luồng tiếp theo. Chủ đề đi từ trạng thái này runningsang trạng thái khác ready. Các trạng thái đang chạy và sẵn sàng là các trạng thái con của trạng thái RUNNABLE.

PS Bình luận, bổ sung, sửa chữa, nhận xét đều được chào đón =)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION