執行緒通訊之生產者與消費者 小碼哥java

2021-08-08 23:02:51 字數 2088 閱讀 6951

定義三個類,分別是producer(生產者),consumer(消費者),sharereasource(公共區域)。

定義公共區域類的目的:

解除耦合關係,如果沒有公共區域,那麼生產者類中將要引用消費者,消費者類中也需要引用生產者,這樣會使生產者和消費者彼此都耦合太深,如果修改了消費者,需要修改生產者,如果修改了生產者,也需要修改消費者。

生產者類如下:

public

class

producer

implements

runnable

public

void

run()

}}

消費者類如下:
public

class

consumer

implements

runnable

public

void

run()

}}

公共區域類如下:
public

class shareresource

public

void

popup()

}

測試類如下:
public

class test

}

上述基本能實現生產者與消費者的關係,但是也是可能造成執行緒不安全問題。

解決方法:

1.使用synchronized**塊

2.使用synchronized方法

3.使用lock機制

在object類中,操作執行緒的方法:

都得使用當前同步監聽物件來呼叫,否則報錯illegalmonitorstateexception

以下為object類中與執行緒相關的幾個方法:

void wait(long timeout):讓當前執行緒失去同步監聽物件,進入等待,若等待時間一到,或者其他執行緒來喚醒它,才會再次擁有同步監聽物件。

void wait():讓當前執行緒失去同步監聽物件,進入無限制的等待,除非其他執行緒喚醒它,不然永遠醒不過來

void notify():喚醒在此同步監聽物件上等待的乙個執行緒

void notifyall():喚醒在此同步監聽物件上等待的所有程序

方式1:使用synchronized方法

public

class shareresourcecatch(interruptedexception e)

}this.name=name;

this.gender=gender;

isempty=false;

this.notifyall();

}public

void

popup()

catch(interruptedexception e)

}system.out.println(this.name+"---"+this.gender);

isempty=true;

this.notifyall();

}}

方式2:使用lock機制

public

class shareresource

this.name=name;

this.gender=gender;

isempty=false;

condition.signal();//等價於同步監聽物件.notiy();

}catch(exception e)

finally

}public

void

popup()

system.out.println(this.name+"---"+this.gender);

isempty=true;

condition.signal();

}catch(exception e)finally

}}

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

執行緒的通訊 生產者消費者

public static void main string agrs class resource catch interruptedexception e this.name name cont system.out.println thread.currentthread getname pr...

執行緒通訊 生產者 消費者模式

恢復內容開始 執行緒是作業系統中獨立的個體,但這些個體之間如果沒有特殊的處理就不能成為乙個整體。而執行緒間的通訊機制就是成為整體的必用方案。執行緒間的通訊會使系統的互動性更強,在提高cpu利用率的同時還會使程式設計師對各執行緒任務在處理的過程中進行有效的把控和監督。等待 通知機制 執行緒之間不是獨立...