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(); } }