Java多线程的简单应用--生产者与消费者
Java多线程的简单应用--生产者与消费者
加入同步、加入等待与唤醒
代码演示
package chapter_nine;
//定义商品类:信息
class Info{
private String name; //定义信息名称name
private String content; //定义信息内容content
private boolean flag = true; //定义生产消费标志,flag为false只能进行消费,flag为true只能生产
//setter()和getter()方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
/**
* 定义同步set()方法, 为信息类Info生产信息
* 线程执行至此时不能中途被打断
*
* @param name
* @param content
*/
public synchronized void set(String name, String content){
if(!flag){ //若flag为false,生产者暂时无法生产
try{
super.wait(); //需要等待消费者消费
}catch (Exception e){
e.printStackTrace(); //异常处理
}
}
this.setName(name); //设置信息类的名称
try{
Thread.sleep(300);
}catch (Exception e){
e.printStackTrace();
}
this.setContent(content); //设置信息类的内容
System.out.println("生产者生产成功:" + this.getName() + "-->" + this.getContent());
flag = false; //将标志位flag置为false,代表商品等待消费者消费
super.notify(); //唤醒等待的进程
}
/**
* 消费者进行消费的方法,此为同步方法,线程执行中不能被中断
*/
public synchronized void get(){
if(flag){ //若flag为true的话消费者暂时无法消费
try{
super.wait(); //需等待生产
}catch (Exception e){
e.printStackTrace();
}
}
try{
Thread.sleep(300);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("消费者消费成功:" + this.getName() + "-->" + this.getContent()); //进行消费
flag = true; //标志位置为true
super.notify(); //唤醒等待的进程
}
}
//定义生产者类
class Producer implements Runnable{
private Info info = null; //定义商品属性
public Producer(Info info){ //以构造方法将商品传入
this.info = info;
}
@Override//覆写run()方法
public void run() {
boolean flag = true; //定义标志,根据标志的不同负责生产的产品
for(int i = 0; i < 50; i++){
if (flag){
this.info.set("李兴华", "JAVA讲师"); //flag为true生产此种信息商品
flag = false;
}else {
this.info.set("mldn","www.mldnjava.cn"); //flag为false生产此种信息商品
flag = true;
}
}
}
}
//定义消费者类
class Consumer implements Runnable{
private Info info = null; //定义商品
public Consumer(Info info){ //以构造方法的方式传入商品对象
this.info = info;
}
@Override//覆写run()方法
public void run() {
for(int i = 0; i < 50; i++){
try{
Thread.sleep(300);
}catch (Exception e){
e.printStackTrace();
}
this.info.get(); //进行信息消费
}
}
}
public class Pag301 {
public static void main(String[] args) {
Info i = new Info(); //实例化信息商品
Producer pro = new Producer(i); //实例化生产者对象线程
Consumer consumer = new Consumer(i); //实例化消费者对象线程
new Thread(pro).start(); //启动生产者线程
new Thread(consumer).start(); //启动消费者线程
}
}
运行结果
生产者生产成功:李兴华-->JAVA讲师
消费者消费成功:李兴华-->JAVA讲师
生产者生产成功:mldn-->www.mldnjava.cn
消费者消费成功:mldn-->www.mldnjava.cn
生产者生产成功:李兴华-->JAVA讲师
消费者消费成功:李兴华-->JAVA讲师
生产者生产成功:mldn-->www.mldnjava.cn
消费者消费成功:mldn-->www.mldnjava.cn
生产者生产成功:李兴华-->JAVA讲师
消费者消费成功:李兴华-->JAVA讲师
......