多线程中的生产者消费者问题

package domain;
/**
 * 测试用类
 * @author dell
 *
 */
public class Person {
	private String name;
	private String sex;
	private boolean flag;
	public Person(boolean flag){
		this.flag = flag;
	}
	public boolean getFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

}
package baidumap;

import domain.Person;

public class ThreadDemo02 {
	public static void main(String[] args) {
		Person p = new Person(false);
		ProducerTask producerTask = new ProducerTask(p);
		ConsumerTask consumerTask = new ConsumerTask(p);
		Thread t1 = new Thread(producerTask);
		Thread t2 = new Thread(consumerTask);
		t1.start();
		t2.start();

	}
}

// 生产者
class ProducerTask implements Runnable {
	private Person p;

	public ProducerTask(Person p) {
		this.p = p;
	}

	boolean flag = true;

	public void run() {
		// 生产者不断赋值
		while (true) {
			synchronized (p) {
				if (!p.getFlag()) {    // 如果还没有值就往里赋值
					p.setFlag(true);	
					if (flag) {   	   // 这个判断主要是为了两次赋不同的值,看到效果
						p.setName("张三");
						p.setSex("男");
						flag = false;
						continue;
					}
					if (!flag) {
						p.setName("小红");
						p.setSex("女");
						flag = true;
						continue;
					}
				}
			}
		}
	}
}

// 消费者
class ConsumerTask implements Runnable {
	private Person p;

	public ConsumerTask(Person p) {
		this.p = p;
	}

	public void run() {
		// 消费者不断取值
		while (true) {
			synchronized (p) {
				if (p.getFlag()) {    // 如果有值了就取值出来
					p.setFlag(false);
					System.out.println(p.getName() + "............." + p.getSex());
				}
			}
		}
	}
}

运行效果如下:没有出现线程安全问题

猜你喜欢

转载自blog.csdn.net/qq_41907991/article/details/81130352