java 執行緒間通訊,多生產者多消費者問題

2021-08-10 17:55:05 字數 2642 閱讀 2580

/**

* 多生產者,多消費者的問題

* if判斷標記,只判斷一次,會導致不該 執行的執行緒執行了,出現 了資料錯誤 的情況

* while判斷標記,解決了執行緒獲取執行權後,是否要執行**

* notify:只能喚醒乙個執行緒,如果 本方喚醒 了本方,沒有意義 ,而且 while 判斷標記 + notify會導致死鎖

* notifyall:解決了本方執行緒一定會喚醒對方執行緒的問題

** jdk1.5以後將同步 和鎖封裝成了物件 ,並將操作鎖的隱式方式 定義 到了該 物件 中,

* 將隱式動作變成 了顯示 動作**

** lock介面:出現替代了同步**塊或者同步函式,將同步的隱式鎖操作變成 現實鎖操作

* 同時更為靈活,可以乙個鎖上加上多組監視器

* lock():獲取鎖

* unlock():釋放鎖,通常需要定義finally**塊中

** condition介面:出現 替代 了object中的wait notify notifyall方法

* 將這些監視器方法單獨進行了封裝,變成 condition監視器物件

* 可以任意鎖進行組合

* await();signal();signlall()

*/class resource catch (interruptedexception e)

}this.name = name+count;

count++;

system.out.println(thread.currentthread().getname()+"..生產者..."+this.name);

flag = true;

// notifyall();

// condition.signalall();

consumer_con.signal();

}finally

}public synchronized void out3() catch (interruptedexception e)

}system.out.println(thread.currentthread().getname()+".......消費者........"+this.name);

flag = false;

// notifyall();

// condition.signalall();

pro_con.signal();

}finally

}public void set2(string name) catch (interruptedexception e)

}this.name = name+count;

count++;

system.out.println(thread.currentthread().getname()+"..生產者..."+this.name);

flag = true;

// notifyall();第一次的用法

// condition.signalall();第三次的用法

consumer_con.signal();

}finally

}public synchronized void out2() catch (interruptedexception e)

}system.out.println(thread.currentthread().getname()+".......消費者........"+this.name);

flag = false;

// notifyall();

// condition.signalall();

pro_con.signal();

}finally

}public synchronized void set(string name) catch (interruptedexception e)

}this.name = name+count;

count++;

system.out.println(thread.currentthread().getname()+"..生產者..."+this.name);

flag = true;

notifyall();

}public synchronized void out() catch (interruptedexception e)

}system.out.println(thread.currentthread().getname()+".......消費者........"+this.name);

flag = false;

notifyall();

}}class prodeucer implements runnable

@override

public void run()

}}class consumer implements runnable

@override

public void run()

}}public class producerconsumerdemo

}

Java 多執行緒間通訊 多生產 多消費問題

生產者,消費者 多生產者,多消費者的問題 if判斷標記 只有一次 會導致不該執行的執行緒執行了,出現了資料錯誤的情況 while判斷標記 解決了執行緒獲取執行權後,是否要允許 notifyall解決了 本方執行緒一定會喚醒對方執行緒 但是影響效率 notify 只能喚醒乙個執行緒,如果本方喚醒了本方...

java多執行緒經典問題四 多生產者多消費者問題

多生產者多消費者 兩個生產線程,兩個消費執行緒 兩個任務 生產任務,消費任務 乙份資料 public class demo5 資料類 class product1 catch interruptedexception e this.name name this.price price count s...

python queue 多生產者,多消費者

專案需求是從快 爬取ip,運用到專案中,設定佇列的大小,當有ip被消耗時,就新增新的ip到佇列中,獲取ip的頁面是不斷重新整理的。總的來說,就是一方不斷把爬取ip存到佇列中,一方不斷從佇列中取ip,消耗ip,此處爬取的是快 首先建立乙個佇列 from queue import queue q que...