设计一个生产与消费的程序---模拟竞拍、抢答器

设计一个生产与消费的程序

要求,生产一台,就消费一台,如果没有新的,就等待生产出来,在消费,如果生产出来的没有被消费,则等待消费之后再生产。

解决思路:使用多线程

原理:1.处理这个问题,需要使用多线程,使用多线程就会涉及到方法同步的问题,多线程同步又会涉及到死锁的问题,所以在处理多线程问题时,要很细心。

          2.使用线程同步方法,加入Object类对线程的支持-------等待、唤醒

          3.实现Runnable接口,可以资源共享

 

package thread.productCustom;

public class Info {
	private String name;
	private String content;
	private boolean flag=false;
	
	public synchronized void set(String name,String content){
		if (flag) {
			try {
				super.wait();         //调用Object类对线程的支持
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		setName(name);
		setContent(content);
		System.out.println("完成入参");
		flag = true;
		super.notify();
	}
	
	public synchronized void get(){
		if (!flag) {
			try {
				super.wait();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		System.out.println("完成出参:"+getName()+"--->"+getContent());
		flag=false;
		super.notify();
	}
	
	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;
	}
}
package thread.productCustom;

public class Product implements Runnable {
	private Info info = null;
	
	public Product(Info info){
		this.info = info;
	}

	@Override
	public void run() {
		boolean flag  = false;
		for(int i = 0; i<10;i++){
			if (flag) {
				this.info.set("clj", "Java开发工程师!"+i);
				flag = false;
			}else {
				this.info.set("W3C", "学的不仅仅是梦想!"+i);
				flag = true;
			}
		}
	}
}
package thread.productCustom;

public class Customer implements Runnable{
	private Info info = null;
	public Customer(Info info){
		this.info = info;
	}
	@Override
	public void run() {
		for(int i=0;i<10;i++){
			try {
				Thread.sleep(100);
			} catch (Exception e) {
			}
			this.info.get();
		}
	}
}

结果:

完成入参
完成出参:W3C--->学的不仅仅是梦想!0
完成入参
完成出参:clj--->Java开发工程师!1
完成入参
完成出参:W3C--->学的不仅仅是梦想!2
完成入参
完成出参:clj--->Java开发工程师!3
完成入参
完成出参:W3C--->学的不仅仅是梦想!4
完成入参
完成出参:clj--->Java开发工程师!5
完成入参
完成出参:W3C--->学的不仅仅是梦想!6
完成入参
完成出参:clj--->Java开发工程师!7
完成入参
完成出参:W3C--->学的不仅仅是梦想!8
完成入参
完成出参:clj--->Java开发工程师!9

模拟竞拍、抢答器

解决思路:使用多线程

原理:  1.实现Runnable接口,资源共享

             2.使用关键字synchronized实现同步

package thread.answer;

public class MyThread implements Runnable{
	private boolean flag = true;
	
	
	@Override
	public void run() {
		this.answer();
	}
	
	public synchronized void answer(){
		while (flag) {
			System.out.println(Thread.currentThread().getName()+"success!");
			flag = false;
			return;
		}
		System.out.println(Thread.currentThread().getName()+"failed");
		return;
	}

	public static void main(String[] args) {
		MyThread my = new MyThread();
		new Thread(my,"线程1").start();
		new Thread(my,"线程2").start();
		new Thread(my,"线程3").start();
		new Thread(my,"线程4").start();
	}
}
线程1success!
线程3failed
线程4failed
线程2failed

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值