之前的內容:理解多執行緒。建立多執行緒。多執行緒的安全問題/分析與理解。安全問題的解決辦法/鎖
之前的例子都是多個執行緒執行乙個執行緒任務,多執行緒的提高——多個執行緒執行不同的執行緒任務,併發執行
例如:消費者與生產者,乙個消費乙個生產,執行的執行緒任務不同,但是處理的資源是一樣的。但是要求同時進行
這叫做執行緒間的通訊——你有你的動作,我有我的動作,但是處理的是同乙個資源
初步**:(執行有錯誤)
package thread;
/*執行緒的提公升;生產者消費者問題
乙個消費乙個生產,執行的執行緒任務不同,但是處理的資源是一樣的。但是要求同時進行
//執行緒間的通訊
簡化後的生產者和消費者——生產乙個 消費乙個
1.描述資源
2.描述生產者,具備自己的任務
3.描述消費者,具備自己的任務
*///描述資源——屬性:名字,編號。行為:對商品名稱賦值,獲取商品
class resource
//消費者的
public void out()
}class producer implements runnable
public void run()
}//描述消費者
class consumer implements runnable
public void run()
}public class producerandconsumer
}
執行結果:有錯誤
問題:這個程式的輸出必須遵守,生產乙個消費乙個,正確的資料應該為:1 1 2 2 3 3 4 4 5 5.
以上兩種錯誤情況是其中的兩種,現在針對相應的錯誤做出解決方案:
1.很早被生產的商品(編號已經)被覆蓋,才被消費到
輸出結果:1 2 3 4 5 6(生產者)//1 .。。。(消費者)
按理說編號1 早已經被覆蓋,不應該現在才被消費到
解決辦法《這是執行緒的安全問題——使用同步 ——————解決了該問題
2.問題1 解決,但是又出現新的問題:有些商品不會被消費到(連續生產但是沒有消費/對同乙個商品進行多次消費):1 2 3 4 5 //(生產者)5 5 5 5//(消費者)
我們的希望應該是:生產乙個消費乙個
思考:什麼時候生產————————盤子裡沒有商品時
什麼時候消費————————————盤子裡有商品時
設定標記
思路
/*執行緒的提公升;生產者消費者問題
乙個消費乙個生產,執行的執行緒任務不同,但是處理的資源是一樣的。但是要求同時進行
//執行緒間的通訊
簡化後的生產者和消費者——生產乙個 消費乙個
1.描述資源
2.描述生產者,具備自己的任務
3.描述消費者,具備自己的任務
*///描述資源——屬性:名字,編號。行為:對商品名稱賦值,獲取商品
class resourcecatch(interruptedexception e){}//存在商品,此執行緒停止
}else
}//消費者的
public synchronized void out()catch(interruptedexception e){} //沒有商品,消費者停止
}system.out.println(thread.currentthread().getname()+" 消費者 "+this.name);
flag =false;//修改標記
notify();//喚醒生產者
}}//描述生產者
class producer implements runnable
public void run()
}}//描述消費者
class consumer implements runnable
public void run()
}}public class producerandconsumer
}
多執行緒9 執行緒池
從原始碼中可以看出,執行緒池的建構函式有7個引數,分別是corepoolsize maximumpoolsize keepalivetime unit workqueue threadfactory handler 一 corepoolsize 執行緒池核心執行緒大小 執行緒池中會維護乙個最小的執行...
多執行緒 Java多執行緒與併發
實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...