-
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
-
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
synchronized
khô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. - 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àywait()
chỉ có thể được gọi bên trong một khốisynchronized
trê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ọiwait()
, luồng hiện tại sẽ giải phóng khóa khỏi đối tượngmonitor
và chuyển sang trạng thái WAITING, chờ phương thức được gọimonitor.notify()
bởimonitor.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. -
Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức
Việc gọi phương thức này sẽ đặt luồng ở trạng thái TIMED_WAITING.wait(500)
?
Bằng cách tương tự với phương thứcwait()
,wait(timeout)
nó chỉ có thể được gọi bên trong một khốisynchronized
trê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ượngmonitor
và chuyển sang chế độ ngủ trong 500 mili giây. Đối tượngmonitor
có 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ếumonitor
nó 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(); … }
Saumonitor.wait()
, thread sẽ chuyển sang trạng thái WAITING. Một phương thứcnotify()
được gọi bởi một luồng khác trên một đối tượngmonitor
sẽ 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. -
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. -
Ba luồng trong khối được đồng bộ hóa được gọi là
Hai trong số chúng sẽ chuyển sang trạng thái BLOCKED, một vào trạng thái RUNNABLEwait()
đố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ọinotifyAll()
? -
Nó khác
Mặc dù thực tế là nójoin(500)
với thế nàowait(500)
?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ứcjoin()
đượ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. -
Nó khác
wait(500)
với thế nàosleep(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. -
Chuỗi sẽ chuyển sang trạng thái nào khi gọi phương thức
Khi một phương thức được gọiyield()
?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àyrunning
sang trạng thái khácready
. 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.
GO TO FULL VERSION