執行緒初步(二)
今天我們將通過執行緒來談一談生產者消費者的問題
首先我們寫一個小程式生產一個商品並消費一個商品
/**
* 寫一個商品者生產消費者消費的執行緒小程式
* @author lover
*
*/
class goods{
private int sum=1;
private String name;
public void set(String name){
this.name=name+sum;
sum++;
System.out.println(sum);
System.out.println("....生產...." +this.name);
}
public void out(){
System.out.println(".......消費........"+this.name);
}
}
class produce implements Runnable{
goods s;
public produce(goods s){
this.s=s;
}
public void run(){
while(true){
s.set("麵包");
}
}
}
class customer implements Runnable{
goods s;
public customer(goods s){
this.s=s;
}
public void run(){
while(true){
s.out();
}
}
}
public class ShangPin {
public static void main(String[] args) {
goods s=new goods();
produce t1=new produce(s);
customer t2=new customer(s);
Thread t11=new Thread(t1);
Thread t22=new Thread(t2);
t11.start();
t22.start();
}
}
執行結果如下
....生產....麵包19312
19314
....生產....麵包19313
19315
....生產....麵包19314
19316
....生產....麵包19315
19317
....生產....麵包19316
19318
....生產....麵包19317
19319
....生產....麵包19318
19320
.......消費........麵包19166
.......消費........麵包19319
.......消費........麵包19319
.......消費........麵包19319
執行之後發現一個很嚴重的問題出現了多生產和消費已經消費的產品,此時我們希望的是能夠生產一個消費一個。之後我們改進程式碼
/**
* 寫一個商品者生產消費者消費的執行緒小程式
* @author lover
*
*/
class goods{
private int sum=1;
private String name;
boolean flag=false;
public synchronized void set(String name){
if(!flag){
this.name=name+sum;
sum++;
System.out.println("....生產...."+this.name);
flag=true;
notifyAll();
}else{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public synchronized void out(){
if(flag){
System.out.println(".......消費........"+this.name);
flag=false;
notifyAll();
}else{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class produce implements Runnable{
goods s;
public produce(goods s){
this.s=s;
}
public void run(){
while(true){
s.set("麵包");
}
}
}
class customer implements Runnable{
goods s;
public customer(goods s){
this.s=s;
}
public void run(){
while(true){
s.out();
}
}
}
public class ShangPin {
public static void main(String[] args) {
goods s=new goods();
produce t1=new produce(s);
customer t2=new customer(s);
Thread t11=new Thread(t1);
Thread t22=new Thread(t2);
t11.start();
t22.start();
}
}
我們來看一下結果
`....生產....麵包45863
.......消費........麵包45863
....生產....麵包45864
.......消費........麵包45864
....生產....麵包45865
.......消費........麵包45865
....生產....麵包45866
.......消費........麵包45866
....生產....麵包45867
.......消費........麵包45867
....生產....麵包45868
.......消費........麵包45868
....生產....麵包45869
.......消費........麵包45869
....生產....麵包45870
.......消費........麵包45870
....生產....麵包45871
`
已經很好的解決了出現的問題
下一節我們將使用jdk1.5的方法來完善這個小程式
相關推薦
執行緒初步(二)
今天我們將通過執行緒來談一談生產者消費者的問題 首先我們寫一個小程式生產一個商品並消費一個商品 /** * 寫一個商品者生產消費者消費的執行緒小程式 * @author lover * */ class goods{ private i
java多執行緒之(二)鎖
一,鎖 在物件的建立時java會為每個object物件分配一個monitor( 監視器或者監視鎖),當某個物件的同步方法(synchronized methods )被多個執行緒呼叫時,該物件的monitor將負責處理這些訪問的併發獨佔要求。 當一個執行緒呼叫一個物件的同步方法時(sy
JAVA執行緒總結( 二)
繼續上篇的總結,這次我們講執行緒同步機制 執行緒同步是為了確保執行緒安全,所謂執行緒安全指的是多個執行緒對同一資源進行訪問時,有可能產生資料不一致問題,導致執行緒訪問的資源並不是安全的。如果多執行緒程式執行結果和單執行緒執行的結果是一樣的,且相關變數的值與預期值一樣,則是執行緒安全的。
Java多執行緒之執行緒排程(二)
(一)執行緒優先順序 執行緒優先順序用1~10表示,10表示優先順序最高,預設值是5.每個優先順序對應一個Thread類的公用靜態常量。如 public static final int MIN_PRIORITY = 1; public static final int NO
linux多執行緒入門(二)互斥量
當多個執行緒訪問一個共享的變數的時候是非常危險的,可能會拿到錯誤的資料或者程式崩潰! 所以為了安全的使用執行緒引入了互斥量的做法 兩個互斥量的函式為 pthread_mutex_lock(pthread_mutex_lock* lock) pthread_mutex_unlock(p
java多執行緒-初探(二)
java多執行緒-初探(一) 常見的執行緒函式 sleep 當前執行緒暫停 join 加入到當前執行緒中 setPriority 執行緒優先順序
Linux學習之多執行緒程式設計(二)
言之者無罪,聞之者足以戒。 ——《詩序》 (二)、執行緒的基本控制 1、終止程序: 如果程序中的任意一個程序呼叫了exit、_exit、_Exit,那麼整個程序就會終止 普通的單個程序有以下3種退出方式,這樣不會終止程序: (1)從啟動例程中返回,返回值是執行緒的退
程序管理實驗——POSIX下執行緒控制(二)
實驗目的 1、通過觀察、分析實驗現象,深入理解執行緒及執行緒在排程執行和記憶體空間等方面的特點,並掌握執行緒與程序的區別。 2、掌握在POSIX 規範中pthread_create() 函式的功能和
執行緒執行者(二)建立一個執行緒執行者
宣告:本文是《 Java 7 Concurrency Cookbook 》的第四章,作者: Javier Fernández González 譯者:許巧輝 校對:方騰飛 建立一個執行緒執行者 使用Executor framework的第一步就是建立一個ThreadPoolEx
執行緒管理(二)獲取和設定執行緒資訊
宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:歐振聰 獲取和設定執行緒資訊 Thread類的物件中儲存了一些屬性資訊能夠幫助我們來辨別每一個執行緒,知道它的狀態,調整控制其優
基本執行緒同步(二)同步方法
宣告:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González 譯者:許巧輝 校對:方騰飛 同步方法 在這個指南中,我們將學習在Java中如何使用一個最基本的同步方法,即使用 synchronized關鍵字
多執行緒程式設計(二)——面試題,每個執行緒只打印一種字元,多個執行緒協同順序列印n次字串(求大神的其他實現方案)
(這個是歡聚時刻(YY)的筆試題,在筆試的時候沒有寫出來,後來自己寫了出來,希望大神能給出更優秀的解決方案……ps:現在面試官總有面試時問筆試程式設計題思路的習慣,呵呵) 題目簡述: 輸入一個字串以
多執行緒系列(二)---多個執行緒多個鎖
多個執行緒多個鎖:多個執行緒,每個執行緒都可以拿到自己指定的鎖,分別獲得鎖之後,執行synchronized方法體內容。 關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼(方法)當
Java多執行緒之執行緒池(二)
java.util.concurrent包是jdk1.5以後使用的執行緒庫,在jdk1.5之前主要使用java.lang和java.util中的類實現 package three.day.thread; import java.util.Random; import ja
C++多執行緒系列(二)執行緒互斥
首先了解一下執行緒互斥的概念,執行緒互斥說白了就是在程序中多個執行緒的相互制約,如執行緒A未執行完畢,其他執行緒就需要等待! 執行緒之間的制約關係分為間接相互制約和直接相互制約。 所謂間接相互制約:一個系統中的多個執行緒必然要共享某種系統資源如共享CPU,共享印表機。間接制
最簡單易懂的RxJava2.0學習教程之RxJava2的執行緒排程(二)
一、RxJava2執行緒排程 使用RxJava的時候,在沒有切換執行緒的情況下, 上游(observable)和下游(observer)是工作在同一個執行緒中的,即都在主執行緒中。 話不多說上程式碼: Observable<Integer>
多執行緒學習(二):執行緒間的資料共享
資料不共享的情況 public class MyThread04 extends Thread{ private int count=5; public MyThread04(String threadName) { this.setName(threadName); }
C++——多執行緒程式設計(二)std::mutex 執行緒同步、解決資源競爭問題
前言 執行緒同步 這裡的“同”不是同時、一起執行的意思,而是指協同、協助、互相配合。執行緒同步是指多個執行緒協同步調,按預定的先後次序進行執行。 執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;
基本的執行緒機制(二)
2.Thread類 將Runnable物件轉變為工作任務的傳統方式是把他提交給一個Thread構造器,如下 public class BasicThreads { public static void main(String[] args
java多執行緒程式設計(二)
java多執行緒程式設計(二) volatile、synchronized及鎖對比 volatile的使用優化 1、追加位元組能優化效能 如果佇列的頭節點和尾節點都不足64位元組的話,處理器會將他們都讀到同一個快取記憶體行中,在多處理器 下每個處理器都會