问题点:为什么消费者会乱序呢,不是同步类吗?
商品类:
package cn.sxt.thread9;
public class Goods {
private String name;
private String brand;
public Goods() {
super();
// TODO Auto-generated constructor stub
}
public Goods(String name, String brand) {
super();
this.name = name;
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
生产者:
package cn.sxt.thread9;
public class Producer implements Runnable {
private Goods goods;
private int i;
public Producer(Goods goods){
this.goods = goods;
}
@Override
public void run() {
//生产商品
for(int i=0;i<10;i++){
if(i%2!=0){
this.get("小馒头","旺仔");
}else{
this.get("矿泉水","娃哈哈");
}
}
}
public synchronized void get(String name,String brand){
goods.setName(name);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
goods.setBrand(brand);
System.out.println("生产者线程生产了:"+goods.getBrand()+"--------"+goods.getName());
}
}
消费者:
package cn.sxt.thread9;
public class Consumer implements Runnable {
private Goods goods;
public Consumer(Goods goods){
this.goods = goods;
}
@Override
public void run() {
// 获取商品
for(int i=0;i<10;i++){
this.get();
}
}
public synchronized void get(){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("-----消费者线程取得了"+goods.getBrand()+"---------"+goods.getName());
}
}
测试类
package cn.sxt.thread9;
public class TestGoods {
public static void main(String[] args){
Goods g= new Goods();
Thread t = new Thread(new Producer(g));
Thread t1 = new Thread(new Consumer(g));
t.start();
t1.start();
}
}

源代码
MyThread.rar