1. 程式人生 > >生產者和消費者

生產者和消費者

class exc i++ 在一起 ble flag 測試類 lag 消費者

package xianchencaozuo.demo;
/*
 * 生產者和消費者案例
 * 問題1:由於多線程的原因,消費者在加入消息名稱,還未加入消息內容,就切到了消費者線程,這樣會將消息名稱和上一個消息的內容
 * 加在一起
 * 為了解決這個問題,可以使用同步
 * 
 */
//信息類,設置信息名,信息內容,獲得信息名,信息內容
class Info{
    private String infoname;
    private String infoconnet;
    public void setinfoname(String infoname){
        this.infoname = infoname;
    }
    
public String getinfoname(){ return infoname; } public void setinfoconnet(String infoconnet){ this.infoconnet = infoconnet; } public String getinfoconnet(){ return infoconnet; } } //生產者類實現runnable class product implements Runnable{ //設置一個標誌位 private
boolean flag = false; //product構造方法為屬相賦值 private Info info = null; public product (Info info){ this.info = info; } public void run(){ for (int i = 0; i < 50; i++) { if (flag) { this.info.setinfoname("sophia "); //在名稱 和內容之間加入延遲
try{Thread.sleep(500);} catch(Exception e){ System.out.println(e.getStackTrace()); } this.info.setinfoconnet("歡迎老師"); //修改標誌位 flag = false; } else { this.info.setinfoname("測試開發 "); //在名稱 和內容之間加入延遲 try{Thread.sleep(500);} catch(Exception e){ System.out.println(e.getStackTrace()); } this.info.setinfoconnet("我要測試開發"); //修改標誌位 flag = true; } } } } //消費者類 class consumer implements Runnable{ private Info info = null ; public consumer(Info info){ this.info = info; } public void run(){ for (int i = 0; i <50; i++) { //取信息名稱 和信息內容,並加入延遲 System.out.println(this.info.getinfoname()); try{Thread.sleep(500);} catch(Exception e){ System.out.println(e.getStackTrace()); } System.out.println(this.info.getinfoconnet()); } } } //測試類 public class ThreadCaseDemo { public static void main(String[] args) { Info in = new Info(); product pd = new product(in); consumer cs = new consumer(in); new Thread(pd).start(); new Thread(cs).start(); } }

生產者和消費者