執行緒間通訊:多個執行緒在處理同一資源,但是任務卻不同。下面編寫乙個輸入輸出例項:
//資源
class resource
//輸入
class input implements runnable
public void run()
else
}x=(x+1)%2;
} }}//輸出
class output implements runnable
public void run()
} }}
class resourcedemo
}
執行結果:
結果可以看到總是先大量輸出乙個人的資訊,再輸出另乙個人的資訊,這是因為輸入輸出執行緒一直在不停的執行。
而我們更需要當輸入乙個人資訊時就馬上輸出他的資訊,而不是被覆蓋,這就引入了執行緒間通訊的--等待喚醒機制。
等待喚醒機制:
2.notify(): 喚醒執行緒池中的乙個執行緒(任意)。
3.notifyall():喚醒執行緒池(等待集)中的所有執行緒。
注:這些方法都必須定義在同步中,因為這些方法是用於用於操作執行緒狀態的方法。必須要明確到底操作的是哪個鎖上的執行緒。
並且以上三個方法定義在object類中,這是因為這些方法是監視器的方法,監視器其實就是鎖,鎖可以是任意物件,任意物件呼叫的方式一定定義在object類中。
應用等待喚醒機制修改**:
//資源
class resource
//輸入
class input implements runnable
public void run()
//代表r鎖在呼叫wait方法
catch(interruptedexception e){} //wait()方法丟擲了異常,此處只能捕捉
if(x==0) //flag為false即物件沒有賦值,開始對其賦值
else
r.flag=true; //改變標誌位的值,表明資源物件已經被賦值
r.notify(); //喚醒輸出執行緒
}x=(x+1)%2;
} }}//輸出
class output implements runnable
public void run()
//代表r鎖在呼叫wait方法
catch(interruptedexception e){}
system.out.println(r.name+"..."+r.***);
r.flag=false; //表明資源物件現在沒有值,需要被賦值
r.notify(); //喚醒輸入執行緒
}} }
}class resourcedemo
}
執行結果:
間隔產生兩個人物資訊的輸出,不再發生覆蓋。
在本例中,resource類的屬性本應是私有的,但我們卻並沒有這樣定義,這樣導致input類和output類可以直接訪問這些屬性,就造成了安全問題。因此我們要對**進行改寫優化。
//資源
class resource
catch(interruptedexception e){} //同步函式的鎖是this
this.name=name;
this.***=***;
flag=true;
this.notify();
} public synchronized void out() //列印name和***的值(同步函式)
catch(interruptedexception e){}
system.out.println(name+"..."+***);
flag=false;
notify(); }}
//輸入
class input implements runnable
public void run()
else
x=(x+1)%2;
} }}//輸出
class output implements runnable
public void run() }
}class resourcedemo
}
執行結果:
執行緒間通訊
執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...
執行緒間通訊
執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...
執行緒間通訊
執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...