第一步:先创建商品GoodsEntity 实体对象
/**
* 商品实体类
*/
public class GoodsEntity {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二步:创建生产者线程
/**
* 生产者线程
*/
public class ProducerThread implements Runnable{
public boolean isRuning=false;
GoodsEntity goodsEntity =null;//商品实体对象
int id=0; //商品id
public ProducerThread(GoodsEntity goodsEntity){
this.goodsEntity=goodsEntity;
}
@Override
public void run() {
while (isRuning){
synchronized (goodsEntity) {
//使用商品对象来同步代码
try {
if(goodsEntity.getName()==null){
//name 为空说明已经消费完了需要生产商品
goodsEntity.setName("商品" + (++id));
Log.e("Thread_test_pro",Thread.currentThread().getName()+ " 生产商品:---" + goodsEntity.getName());
//商品生产完成,通知消费线程消费
goodsEntity.notifyAll();
}else {
//name 不为空说明商品还没有消费完,等待商品消费
goodsEntity.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
第三步:创建消费者线程
/**
* 消费者线程
*/
public class ConsumerThread implements Runnable{
public boolean isRuning=false;
private GoodsEntity goodsEntity=null;
int count=0;
public ConsumerThread(GoodsEntity goodsEntity){
this.goodsEntity=goodsEntity;
}
@Override
public void run() {
while (isRuning){
synchronized (goodsEntity) {
try {
if(goodsEntity.getName()==null){
//商品为空,说明没有生产新的商品,等待生产
goodsEntity.wait();
}else{
Log.e("Thread_test_con", Thread.currentThread().getName()+ " 消费商品:" + goodsEntity.getName());
goodsEntity.setName(null);//清空商品
//商品消费完之后清空商品,通知生产
goodsEntity.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
第四步:测试
public static void main(){
GoodsEntity goodsEntity=new GoodsEntity();
ProducerThread producerThread=new ProducerThread(goodsEntity);//生产者
ConsumerThread consumerThread=new ConsumerThread(goodsEntity);//消费者
producerThread.isRuning=true;
consumerThread.isRuning=true;
Thread proThrad1=new Thread(producerThread,"生产线程1");
Thread proThrad2=new Thread(producerThread,"生产线程2");
Thread proThrad3=new Thread(producerThread,"生产线程3");
Thread conThrad1=new Thread(consumerThread,"消费线程1");
Thread conThrad2=new Thread(consumerThread,"消费线程2");
Thread conThrad3=new Thread(consumerThread,"消费线程3");
proThrad1.start();
proThrad2.start();
proThrad3.start();
conThrad1.start();
conThrad2.start();
conThrad3.start();
try {
Thread.sleep(6000);
producerThread.isRuning=false;
consumerThread.isRuning=false;
Log.e("Thread_test", "proThrad1.isAlive()="+proThrad1.isAlive());
Thread.sleep(2000);
Log.e("Thread_test", "proThrad1.isAlive()2="+proThrad1.isAlive());
} catch (InterruptedException e) {
Log.e("Thread_test", "InterruptedException ex="+e.toString());
e.printStackTrace();
}
}
备注:调用 goodsEntity.wait(); 之后将自动释放同步。
输出:
01-06 12:45:42.657 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品1
01-06 12:45:42.858 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品1
01-06 12:45:42.959 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品2
01-06 12:45:42.959 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品2
01-06 12:45:43.060 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品3
01-06 12:45:43.061 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品3
01-06 12:45:43.162 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品4
01-06 12:45:43.363 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品4
01-06 12:45:43.465 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品5
01-06 12:45:43.567 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品5
01-06 12:45:43.667 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品6
01-06 12:45:43.768 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品6
01-06 12:45:43.870 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品7
01-06 12:45:44.072 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品7
01-06 12:45:44.174 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品8
01-06 12:45:44.376 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品8
01-06 12:45:44.482 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品9
01-06 12:45:44.684 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品9
01-06 12:45:44.785 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品10
01-06 12:45:44.886 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品10
01-06 12:45:44.988 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品11
01-06 12:45:45.190 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品11
01-06 12:45:45.291 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品12
01-06 12:45:45.393 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品12
01-06 12:45:45.495 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品13
01-06 12:45:45.696 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品13
01-06 12:45:45.798 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品14
01-06 12:45:45.799 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品14
01-06 12:45:45.900 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品15
01-06 12:45:46.103 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品15
01-06 12:45:46.204 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品16
01-06 12:45:46.306 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品16
01-06 12:45:46.407 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品17
01-06 12:45:46.610 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品17
01-06 12:45:46.711 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品18
01-06 12:45:46.812 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品18
01-06 12:45:46.913 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品19
01-06 12:45:47.115 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品19
01-06 12:45:47.216 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品20
01-06 12:45:47.519 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品20
01-06 12:45:47.620 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品21
01-06 12:45:47.722 26348-26397/com.example.test3 E/Thread_test_con: 消费线程1 消费商品:商品21
01-06 12:45:47.823 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品22
01-06 12:45:47.924 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品22
01-06 12:45:48.026 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品23
01-06 12:45:48.228 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品23
01-06 12:45:48.329 26348-26394/com.example.test3 E/Thread_test_pro: 生产线程1 生产商品:---商品24
01-06 12:45:48.330 26348-26398/com.example.test3 E/Thread_test_con: 消费线程2 消费商品:商品24
01-06 12:45:48.431 26348-26395/com.example.test3 E/Thread_test_pro: 生产线程2 生产商品:---商品25
01-06 12:45:48.533 26348-26399/com.example.test3 E/Thread_test_con: 消费线程3 消费商品:商品25
01-06 12:45:48.559 26348-26348/com.example.test3 E/Thread_test: proThrad1.isAlive()=true
01-06 12:45:48.634 26348-26396/com.example.test3 E/Thread_test_pro: 生产线程3 生产商品:---商品26
01-06 12:45:50.560 26348-26348/com.example.test3 E/Thread_test: proThrad1.isAlive()2=true