導航:首頁 > 編程語言 > java多生產者多消費者

java多生產者多消費者

發布時間:2023-07-04 05:23:23

1. java多生產者-多消費者問題(+高分哦!)

生產者向阻塞隊列中放入隨即整數(可以為兩個消費者提供不同的隊列),消費者從隊列中取出元素進行判斷,可以用BlockingQueue實現同步,很方便,質數和平方數判斷在寫個靜態方法即可~自己想想看,需要代碼就說下
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Procer extends Thread
{
private List<BlockingQueue<Integer>> queueList;

public Procer(List<BlockingQueue<Integer>> bQueueList)
{
this.queueList = bQueueList;
}

public void run()
{
int count = 0;
while (count++ < 10)
{
int randomInt = (int) (Math.random() * 100 + 1);
try
{
for(BlockingQueue<Integer> queue:queueList)
{
queue.put(randomInt);
}
System.out.println(randomInt + " is put..");
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
}

public static void main(String[] args)
{
BlockingQueue<Integer> bQueue = new LinkedBlockingQueue<Integer>();
BlockingQueue<Integer> bQueueCopy = new LinkedBlockingQueue<Integer>();
List<BlockingQueue<Integer>> list=new ArrayList<BlockingQueue<Integer>>();
list.add(bQueue);
list.add(bQueueCopy);
new Procer(list).start();
new Procer(list).start();
new Procer(list).start();
new PrimeConsumer(bQueue).start();
new SquareConsumer(bQueueCopy).start();
}
}

class PrimeConsumer extends Thread
{
private BlockingQueue queue;

public PrimeConsumer(BlockingQueue<Integer> bQueue)
{
this.queue = bQueue;
}

public void run()
{
do
{
try
{
int i = (Integer) queue.take();
if (CheckNumber.isPrime(i))
{
System.out.println(i + " is prime..");
}
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
while (queue.size() != 0);
}
}

class SquareConsumer extends Thread
{
private BlockingQueue queue;

public SquareConsumer(BlockingQueue<Integer> bQueue)
{
this.queue = bQueue;
}

public void run()
{
do
{
try
{
int i = (Integer) queue.take();
if (CheckNumber.isSquare(i))
{
System.out.println(i + " is square..");
}
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
while (queue.size() != 0);
}
}

class CheckNumber
{
public static boolean isPrime(int n)
{
if (n == 1)
return false;
for (int i = 2; i < n / 2 + 1; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}

public static boolean isSquare(int n)
{
int l = (int) Math.sqrt(n);
for (int i = 1; i <= l; i++)
{
if (i * i == n)
{
return true;
}
}
return false;
}
}
都寫在一個類里了,比較亂,測試正確~

2. JAVA 多線程 兩個生產者100個包子,容器30,4個消費者

public class Test {
public static void main(String[] args) {
Runnable ticket=new TrainTicket();
Thread seller1=new Thread(ticket);
Thread seller2=new Thread(ticket);
seller1.start();
seller2.start();
}
}
class TrainTicket implements Runnable{
//100張賣完改1000吧假設座位號1-1000;回
public int n=1000;

@Override
public void run() {
while(n>0){
System.out.println(Thread.currentThread().getName()+"賣座位:答"+n);
n--;
}
}
}

3. 關於Java多線程實現生產者和消費者的問題

我大致看了下,看到你同步語句塊的是對synchronized (this),那就是說是對生產者線程版本身,消費者線程本身進權行同步,而不是對緩沖區進行互斥同步,還有我不知道你為什麼要while(!Thread.interrupted())
這么寫 ,你可以參考下這篇 http://jaychang.javaeye.com/blog/680857

4. • 利用java多線程及同步機制實現生產者-消費者模型

製片人:時存在的產品的時候,
消費者生產的產品是不夠的:消費類產品
關鍵:當產品到達上限,停止生產,通知消費者的消費
關鍵2:當達到下限,停止消費,並通知生產者生產
共享數據:

代碼
進口的java.util.ArrayList;
BR />公共類ProcerAndConsumer {
ArrayList的產品=新的ArrayList ();
MAX = 10;
布爾取消;

同步失效產生(){
int的大小= procts.size();
(大小<MAX){
procts.add(大小+「」);
} {
notifyAll()的;
}
}

同步的無效消耗(){
(procts.isEmpty()){
嘗試{
的wait();
}(InterruptedException的E){
e.printStackTrace();
}
}
System.out.println( 「消費procts.remove:」+(0));
}

私有類生產擴展Thread {
@覆蓋
公共無效的run(){...... />(取消){
農產品();
}
}
}

私人階層的消費擴展Thread {
@覆蓋
公共無效的run(){
(取消){
消耗();
}
}
}
/>無效取消(){
取消= TRUE;
}

的公共ProcerAndConsumer(){
新的消費者()。開始();
新的的監制()。開始();}

公共靜態無效的主要(字元串[] ARGS){
新ProcerAndConsumer();
}

}

5. java實現生產者和消費者問題的幾種方式

生產者消費者問題是多線程的一個經典問題,它描述是有一塊緩沖區作為倉庫,生產者可以將產品放入倉庫,消費者則可以從倉庫中取走產品。
解決生產者/消費者問題的方法可分為兩類:
採用某種機制保護生產者和消費者之間的同步;
在生產者和消費者之間建立一個管道。
第一種方式有較高的效率,並且易於實現,代碼的可控制性較好,屬於常用的模式。第二種管道緩沖區不易控制,被傳輸數據對象不易於封裝等,實用性不強。
在Java中有四種方法支持同步,其中前三個是同步方法,一個是管道方法。
wait()
/
notify()方法
await()
/
signal()方法
BlockingQueue阻塞隊列方法
PipedInputStream
/
PipedOutputStream
通過
wait()
/
notify()方法實現:
wait()
/
nofity()方法是基類Object的兩個方法:
wait()方法:當緩沖區已滿/空時,生產者/消費者線程停止自己的執行,放棄鎖,使自己處於等等狀態,讓其他線程執行。
notify()方法:當生產者/消費者向緩沖區放入/取出一個產品時,向其他等待的線程發出可執行的通知,同時放棄鎖,使自己處於等待狀態。
通過await()
/
signal()方法實現:
await()和signal()的功能基本上和wait()
/
nofity()相同,完全可以取代它們,但是它們和新引入的鎖定機制Lock直接掛鉤,具有更大的靈活性。通過在Lock對象上調用newCondition()方法,將條件變數和一個鎖對象進行綁定,進而控制並發程序訪問競爭資源的安全。
通過BlockingQueue方法實現:
它是一個已經在內部實現了同步的隊列,實現方式採用的是我們第2種await()
/
signal()方法。它可以在生成對象時指定容量大小。它用於阻塞操作的是put()和take()方法:
put()方法:類似於我們上面的生產者線程,容量達到最大時,自動阻塞。
take()方法:類似於我們上面的消費者線程,容量為0時,自動阻塞。

6. java多生產者和消費者問題,重復生產消費

我暈看了好久,別人寫的代碼看的真是辛苦,也沒注釋...修改了一堆括弧!!

妥妥的沒問題,你的資源用的數組,換句話說,

你數組被A1線程增加索引1,然後B過來拿走索引1;數組裡面此刻是什麼?當然是0了啊;因為你遞減了...

然後A2被拿到執行權,怎麼樣?是不是還去增加索引1??明白了?

如果你想要不重復,就別遞減就行了!

另外你這么改,有什麼問題看的很醒目,知道發生在哪個線程上!

7. Java培訓都學哪些知識

1、 java語法。
通過任何一本Java入門書籍,都可以學會Java的基本語法。千萬不要認為,你把書上的例子程序都能寫出來就算學會了Java語法。要想真正掌握,還需要做大量的測試題。對語法不準確的理解,會使你寫的代碼出現邏輯錯誤。而這些錯誤會使你在真正的項目開發中吃盡苦頭:你認為正確才會寫上去。而在幾十萬行代碼中找出幾行有邏輯錯誤的代碼,非常困難。因為你幾乎不會懷疑你認為正確的代碼存在錯誤。
2、 常用類。
永遠不要寫別人已經實現的代碼。有很多功能,用JDK中現有的類就可以完成。你需要熟悉JDK.可以通過研究JDK幫助文檔和JDK源代碼的方式,逐漸了解,你需要的類都在什麼地方。一方面,要熟悉有哪些可以直接使用的資源,另一方面,學習一下,SUN公司的工程師怎樣寫代碼。
3、 IDE 集成開發環境。
現在企業最常用的是IBM公司的eclipse ,類似的還有JBuilder 、Idea,NetBeans等等。畢竟,只有5%的頂尖高手在使用簡單的文本編輯器在寫Java代碼。多數程序員都是在使用這些東西。
4、 資料庫
MySql,Oracle,DB2.小項目多數使用MySql這樣的免費資料庫。大一些的項目會考慮使用Oracle或者DB2. Java項目很少使用SqlServer。因此,你還需要學習資料庫方面的一些知識。可以從SQL語言開始。這些資料庫都支持標准SQL.學會基本的SQL,參考具體的資料庫手冊,就可以完成一般的項目開發了。當然,要想使你的程序運行的效率更高,需要更深入的學習。大部分的程序優化,都是從這部分開始的。
5、 JDBC Java資料庫連接。
使用Java程序操作資料庫。這部分非常重要。幾乎所有的企業項目都會用到。
6、 HTML CSS Javascript。
HTML-- 超文本標記語言。
CSS --層疊樣式表。
JavaScript--是一種由Netscape的LiveScript發展而來的腳本語言。
准確的說,這些東西和Java語言本身關系不大。但是,現在的企業項目,以B/S結構的居多。因此,我們的Java程序,會有大量的機會和它們打交道。需要提前准備一下。
7、你需要學習如何使用及管理WEB伺服器,例如tomcat,並且知道如何在其基礎上擴展和維護WEB程序,如何使用它的附加服務,如連接池。
8、 JSP Servlet。
這兩個是初級Java程序員必須掌握的基本技能,是所有B/S結構框架的基礎。相應的,還需要學習EL以及JSTL(StandardTagLibraries)和可以選擇的第三方TagLibraries,以提高表示層的處理能力。
9、企業流行框架 Struts,Spring,Hibernate等。
10、Java設計模式。
有一些特殊的功能,只有按照特定的設計模式才能實現。如果你有了5萬行以上的代碼經驗,可以開始研究一下設計模式。
11、你還要跟上技術發展的步伐,了解在Java項目中使用的新技術。如Ajax等。
還有很多要學習的內容。先介紹這么多吧,自己學習這些內容,估計需要2年左右。如果有個好的指導老師,在培訓學校進行系統學習,則需要3-5個月。
如果選擇培訓,一定要選擇擁有多年JAVA項目開發經驗、測試經驗、及項目管理經驗,採用「教」「練」結合,用真實項目案例進行訓練的教學方式。讓學員掌握實用的技能,在畢業後就有著實戰項目開發經驗,立刻上崗,成為諸多企業搶手的人才。

閱讀全文

與java多生產者多消費者相關的資料

熱點內容
dnf85版本劍魔刷圖加點 瀏覽:407
手機硬碟測試架可以讀取哪些數據 瀏覽:704
ug前後處理結算結果找不到文件 瀏覽:769
網頁框架拆分代碼 瀏覽:382
未來十年網路安全有什麼影響 瀏覽:362
win10更新後進不了劍靈 瀏覽:243
iphone471激活出錯 瀏覽:648
怎麼把文件拷到u盤 瀏覽:620
中伊簽署文件視頻 瀏覽:661
電信光寬頻網路不穩定 瀏覽:504
網路崗軟路由 瀏覽:995
黑莓z10在哪裡下載app 瀏覽:310
net批量下載文件 瀏覽:696
怎麼把蘋果一體機文件拷貝 瀏覽:117
sql文件怎麼寫 瀏覽:9
帝豪ec718導航升級 瀏覽:257
如何運用編程進行統計 瀏覽:570
excel如何拉考勤數據 瀏覽:879
大智慧612手機版本 瀏覽:796
編程試什麼 瀏覽:252

友情鏈接