執行緒間通訊

2021-07-10 15:48:58 字數 2500 閱讀 9675

執行緒間通訊:多個執行緒在處理同一資源,但是任務卻不同。下面編寫乙個輸入輸出例項:

//資源

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類中呢?因為這些方法在操作同...