[英]What's the significance of notify() statement while using wait() in a threading programme
public class ThreadA {
public static void main(String[] args) {
ThreadB threadB = new ThreadB();
threadB.start();
synchronized (threadB) {
try {
threadB.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("the total is ====>"+threadB.total);
}
}
class ThreadB extends Thread
{
int total;
public void run(){
synchronized (this) {
for(int i =0; i<5;i++)
{
System.out.println("lets add===>"+i);
total+= i;
}
notify(); // line no.31
System.out.println("after notify but within lock");
}
System.out.println("after notify but outside lock");
}
}
output :
lets add===>0
lets add===>1
lets add===>2
lets add===>3
lets add===>4
after notify but within lock
the total is ====>10
after notify but outside lock
我的問題:控件不應該在第31行之后立即回到“主”線程。 理想情況下,它不應該打印-在“ let add === >> 4”之后立即顯示“總數====> 10”嗎?
為什么不管第31行的notify()語句如何,它都執行同步塊中的所有語句?
最后幾行的順序將始終不相同。 這取決於線程的調度方式,並且無法保證,具體取決於您擁有的代碼。 執行完notify
的那一刻, wait
結束,因此任何線程都可以按任何順序運行。 但是after notify but within lock
內after notify but within lock
內,因此即使執行了主線程,其仍處於鎖定狀態,無法執行任何操作
我的問題:控件不應該在第31行之后立即回到“主”線程。
您要的是不可能的事情。 調用notify
的線程仍在同步塊中。 另一個線程完成等待后,它又回到了同步塊中。 因此,您要的是將兩個線程同時放在同一對象的同步塊中,而這正是此類塊所禁止的。
synchronized (threadB) {
try {
threadB.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("the total is ====>"+threadB.total);
所以這段代碼做到了:
wait
。 注意:
除非我們處於同步塊中,否則我們無法退出同步塊; 和
從wait
返回之前,我們無法退出同步塊; 從而
我們不能從wait
打印到不包含在同步塊中的總數,因此,當另一個線程保留在同步塊中時,我們就不能這樣做,否則同步塊中將同時有兩個線程。
現在看這段代碼:
notify(); // line no.31
System.out.println("after notify but within lock");
} // exit synchronized block
因此,通知另一個線程的任何線程直到打印后才離開其同步塊。 因此,被通知的線程要等到打印后才能退出其同步塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.