cuốn sách gpt4 ai đã làm

java : wait() method keeps waiting even after calling notifyAll()

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 07:48:17 27 4
mua khóa gpt4 Nike

Hãy xem xét đoạn mã sau

lớp công khai ThreadTest1
{
riêng tư cuối cùng tĩnh dài startTime = System.currentTimeMillis();

public static void main(String args[])
{
Chủ đề ct = Chủ đề mới(new ChildThread());
ThreadTest1.print("bắt đầu các chủ đề con trong MAIN");
ct.start();
đồng bộ(ct)
{
thử
{

ThreadTest1.print("sắp bắt đầu chờ() trong MAIN");
ct.wait();
ThreadTest1.print("sau khi chờ() trong MAIN");
}
bắt (Ngoại lệ e)
{
ThreadTest1.print("Ngoại lệ trong MAIN");
}
}
}

in void tĩnh công khai (Chuỗi s)
{
System.out.println("Milli giây : "+(System.currentTimeMillis()-ThreadTest1.startTime)+"\t: "+s);
}
}

lớp ChildThread triển khai Runnable
{
public void run()
{
được đồng bộ hóa (cái này)
{

thử
{
ThreadTest1.print ("trước luồng thông báo Tất cả trong TRẺ");
thông báoAll();
ThreadTest1.print("thông báoTất cả kết thúc, chế độ ngủ bắt đầu ở TRẺ");
Thread.sleep(10000);
ThreadTest1.print("sau khi thread ngủ trong TRẺ");

}
bắt (Ngoại lệ e)
{
ThreadTest1.print("Ngoại lệ ở TRẺ");
}
ThreadTest1.print("Kết thúc phương thức chạy ở TRẺ");
}
}
}

输出如下:

Mili giây : 12 : bắt đầu các luồng con trong MAIN
Một phần nghìn giây: 13: sắp bắt đầu wait() trong MAIN
Một phần nghìn giây : 13 : trước luồng thông báo Tất cả trong TRẺ
Mili giây : 13 : thông báoTất cả kết thúc, giấc ngủ bắt đầu ở TRẺ
Mili giây: 10015: sau khi ngủ ở TRẺ
Mili giây : 10015 : Kết thúc phương thức chạy trong TRẺ
Mili giây: 10016: sau wait() trong MAIN

notificationAll() được gọi ở mili giây thứ 13. Nhưng quyền kiểm soát chỉ xuất hiện ở trạng thái chờ() ở mili giây thứ 10016.

Từ mã đưa ra ở trên, có vẻ như lệnh gọi wait() không kết thúc ngay sau lệnh gọi notification().

Nhưng tất cả các tập tin bao gồmAPI Java , chỉ định rằng phương thức gọi wait() sẽ nhận được khóa ngay sau khi gọi notification().

Nếu wait() không kết thúc khi thông báo() được gọi, thì nhu cầu thông báo() trở nên không hợp lệ vì phương thức gọi wait() sẽ tự động giành quyền kiểm soát khi phương thức chạy của luồng mới kết thúc, ngay cả khi nó không được gọi là thông báo( ).

Nếu tôi mắc lỗi ở đây, xin vui lòng đợi ai đó chỉ ra.

câu trả lời hay nhất

Vấn đề là bạn đang thông báo và chờ đợikhác biệt sự vật. Bạn đang ở Chủ đề thượng đẳng Chờ đợi() 并在 chạy() Được gọi trong phương thức cái này ...đây là một Chủ đề con.


Vì bạn đã đặt sai tên của mình Chủ đề con lớp học, chuyện này đã được che đậy rồi. cái têngợi ýnó là mộtChủ đề lớp con, nhưng nó thực sự là mộtCó thể chạy được lớp con.

Về java: phương thức wait() vẫn tiếp tục chờ ngay cả sau khi gọi notificationAll(), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/20334637/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress