1. 程式人生 > >13.執行緒間通訊

13.執行緒間通訊

多個執行緒在操作同一個資源,操作動作不同

package 執行緒通訊;


import java.security.interfaces.RSAKey;


import 電話號碼.Main;


/*
 * 例子:生產者消費者
 * 如果兩個執行緒生成,兩個執行緒消費
 */
public class Resource {
private String name;
private int count=1;
private boolean flag=false;//標記

public synchronized void set(String name){
if(flag)
try{
wait();
}catch (Exception e) {
// TODO: handle exception
}
this.name=name+"---"+count++;
System.out.println(Thread.currentThread().getName()+"生產者..."+this.name);
flag=true;
this.notify();


}

public synchronized void out(){
if(!flag){
try {
wait();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName()+"...."+this.name);
flag=false;
this.notify();
}
}
public static void main(String[] args) {
Resource res=new Resource();
Producer pd=new Producer(res);
Consumer cs=new Consumer(res);

Thread t1=new Thread(pd);
Thread t2=new Thread(cs);
t1.start();
t2.start();
}
}
class Producer implements Runnable{
private Resource res;
Producer(Resource res){
this.res=res;
}



@Override
public void run() {
// TODO Auto-generated method stub
while(true){
res.set("+商品+");

}
}

}
class Consumer implements  Runnable{
private Resource res;
Consumer(Resource res){
this.res=res;
}
public void run() {
while(true){
res.out();
}
}
}

-----------------------------------------------------

總結:wait() notify() notifyAll()

wait()等待,不佔用cpu,將執行緒放入執行緒池中

notify()喚醒執行緒池中第一個等待的執行緒

notifyAll()喚醒全部執行緒

wait()會throws InterruptedException

所以只能try處理

上述方法全用在同步中,必須標記鎖(當前執行緒必須擁有此物件鎖):this.notify()

對持有監視器(鎖)的執行緒操作,所以要使用在同步中,因為只有同步才具有鎖。

為什麼操作執行緒的方法可以定義在Object中?

因為這些方法在操作同步中執行緒時,都必須要標記它們所操作執行緒只有的鎖,只有

同一個鎖上的被等待的執行緒,可以被同一個鎖上的notify喚醒(等待和喚醒必須是同一個鎖)

而鎖可以是任意物件,所以可以被任意物件呼叫的方法定義在Object中

相關推薦

13.執行通訊

多個執行緒在操作同一個資源,操作動作不同 package 執行緒通訊; import java.security.interfaces.RSAKey; import 電話號碼.Main; /*  * 例子:生產者消費者  * 如果兩個執行緒生成,兩個執行緒消費  */ pu

Java多執行學習筆記13執行通訊

詳細程式碼見:github程式碼地址   本節內容: 1)  生產者消費者模型     多個生產者和多個消費者: 操作值假死及解決     多個生產者和多個消費者: 操作棧假死及解決 2) 通過管

PyQt5學習筆記13----pyqt執行通訊

 訊號(singal)與槽(slot)用於物件相互通訊,訊號:當某個物件的某個事件發生時,觸發一個訊號,槽:響應指定訊號的所做的反應,其實訊號槽類似於.NET裡面的委託、事件,比如Repeater控制元件類,當行資料繫結後,觸發一個ItemDataBound事件,不管使用者

34-多執行--死鎖+執行通訊+等待喚醒機制+多生產者多消費者問題

一、死鎖 1、死鎖的常見情形之一:同步的巢狀 說明:同步的巢狀,至少得有兩個鎖,且第一個鎖中有第二個鎖,第二個鎖中有第一個鎖。eg:同步程式碼塊中有同步函式,同步函式中有同步程式碼塊。下面的例子,同步程式碼塊的鎖是obj,同步函式的鎖是this。t1執行緒先執行同步程式碼塊,獲取鎖obj,需

執行通訊的訊息機制的Message和Handler

Message是訊息機制的資訊載體,開發人員可以在Message物件中封裝資料,封裝資料的方式有: 1)setData(),在Message中封裝Bundle型別的資料,在接收方使用getData()獲取該Bundle物件。 2)arg1屬性,int型別,用於封裝int型別變數 3)ar

Java利用wait和notify實現執行通訊

       Java的Object類提供了wait和notify方法用於實現執行緒間通訊(因為所有的java類都繼承了Object類,所以所有的java類都有這兩個方法)。這兩個方法在Object類中籤名如下: pu

Java併發程式設計(10):使用wait/notify/notifyAll實現執行通訊的幾點重要說明

在Java中,可以通過配合呼叫Object物件的wait()方法和notify()方法或notifyAll()方法來實現執行緒間的通訊。線上程中呼叫wait()方法,將阻塞等待其他執行緒的通知(其他執行緒呼叫notify()方法或notifyAll()方法),線上程中呼叫notify()方法或notifyAl

python多執行————3、多執行通訊:共享變數,queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):

Java執行通訊--管道

Java提供了多種輸入輸出流用於對資料進行操作,其中管道流pipeStream是一種特殊的流,用於在不同執行緒間直接傳送資料。 pis.read的時候,如果管道內沒有資料,會阻塞。 public class PipeStreamMain { public static voi

Java多執行學習筆記15之執行通訊

詳細程式碼見:github程式碼地址   本節內容: 1)ThreadLocal類的使用     JDK文件及方法翻譯     InheritableThreadLocal的使用   5.

Java多執行學習筆記14之執行通訊

詳細程式碼見:github程式碼地址   本節內容: 1) 實戰 等待/通知之交叉備份 2) 方法join的使用(Jdk文件翻譯及原始碼解析)     join()及join(long)的使用和實現原理   &nbs

安卓多執行通訊和多程序之間通訊有什麼不同?分別怎麼實現?

**當一個程式第一次啟動的時候,Android會去動一個Linux進行和一個主執行緒,預設情況下,所有改程式元件都將在該程序和執行緒中 執行,同時Android會為每個應用程式分配一個單獨的Linux使用者,Android會盡量保留一個正在執行的程序,只在記憶體資源出現不足時,Andro

Java多執行程式設計核心技術 —— 執行通訊

執行緒是作業系統中獨立的個體,但這些個體如果不經過特殊的處理就不能成為一個整體。執行緒間的通訊就是成為整體的比用方案之一,可以說,使執行緒間進行通訊後,系統之間的互動性會更強大,在大大提高CPU利用率的同時還會使程式設計師對個執行緒任務在處理的過程中進行有效的把控與監督。 1、

android進階3step2:Android App通訊——Android執行通訊

Android進階:網路與資料儲存—步驟1:Android網路與通訊(第2小節:Handler) https://blog.csdn.net/qq_17846019/article/details/82906216 Android進階:網路與資料儲存—步驟1:Android網路與通訊(第3小

[one_demo_17]使用傳統方式實現執行通訊的例子

題目: 子執行緒迴圈10次,接著到主執行緒迴圈10次;接著又回到子執行緒迴圈10次,接著又到主執行緒迴圈10次,如此迴圈50次。 使用Object的wait()和notify()方法實現。 Java程式碼 第一種,不使用面向物件的思想實現 /** * 練習執行緒間通訊 *

程序與執行(三)——程序/執行通訊

在使用者空間中建立執行緒   用庫函式實現執行緒(《現代作業系統》 P61) #include<pthread.h> #include<stdio.h> #include<stdlib.h> #define NUMBER_OF_THREAD

java 執行通訊的幾種方式

1.如何讓兩個執行緒依次執行 假設有兩個執行緒,一個執行緒A,一個執行緒B,兩個執行緒分別依次列印 1-3 三個數字即可。 package Test;/** /** * @author Administrator * @createdate 2017-10-10 */ pu

Java執行通訊的同步問題、wait/notify使用

Java執行緒間通訊簡單來說就是多個執行緒同時操作同一個資源,比如一個執行緒設定了姓名、性別,另一個執行緒讀取姓名、性別。 伴隨而來的就是同步問題:比如執行緒a先設定了張三、男,後設置了李四、女,執行緒b要列印這些資訊,由於多執行緒的隨機性,a設定張三、男後,然後a又設定了李四,還未設定性別時,

Java多執行2.2.執行通訊

執行緒間通訊問題 1、執行緒間通訊問題 (1)執行緒間通訊問題:不同種類的執行緒之間針對同一個資源的操作。 (2)通過設定執行緒(生產者)和獲取執行緒(消費者)針對同一個學生物件進行操作。 2、執行緒間通訊舉例 (1)建立學生類 package cn.itca

Java中的多執行執行通訊

/學習筆記/ 執行緒間通訊: 多個執行緒在處理同一資源,但是任務卻不同。 先看一個例子,採用兩個執行緒執行進行輸入和輸出任務: //資源 class Resource { String name; String sex;