找工作练手--一道腾讯的笔试题

今日,在网上搜到一篇讲述在腾讯面经。里面有道题,考的是生产者消费者问题。题目如下:

模拟线程间通信:线程A和B共用一块空间C[] space, 模拟一次线程间的通信:线程A生产一个C物品,并把它放入space中,线程B从space中取出该物品,并输出它的信息。

题目很简单,解题思路:

1.把题目中提到的对象变成程序里的对象,比如JAVA对象。这样需要两个线程,一个消费者线程,一个生产者线程,一个资源对象。

2.定义几个对象之间的操作。消费者线程是从资源对象中取得资源,所以此线程中只要获得资源的对象,便可调用对象方法;生产者线程也一样。

总体意思就是两个线程只负责生产和获取,至于如何获取,则由资源对象本身去协调。

JAVA代码程序如下:

public class ProduceAndComsumer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Resource r = new Resource();
		new Thread(new TheadProducer(r)).start();
		new Thread(new ThreadComsumer(r)).start();
	}

}
class Resource{
	private Object[] object = new Object[10];
	private int i = 0;
	public synchronized void  produce(){
		if(i == object.length){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		object[i++] = new Object();
		System.out.println("生产第" + i + "资源");
		this.notify();
	}
	public synchronized void comsumer(){
		if(i == 0){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("消费第" + i + "资源");
		object[--i] = null;
		this.notify();
	}
}
class TheadProducer implements Runnable{
	Resource resource;
	public TheadProducer(Resource r){
		this.resource = r;
	};
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i = 0; i < 1000; i++)
		resource.produce();
	}
}
class ThreadComsumer implements Runnable{
	Resource resource;
	public ThreadComsumer(Resource r){
		this.resource = r;
	};
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i = 0; i < 1000; i++)
		resource.comsumer();
	}
}
这是JAVA的实现,由此可以引伸出如何用C实现,在windows下肯定要用到windowsAPI了。对windowsAPI的使用不多,尤其对于线程通信的API,还没有详细研究,现在肯定是写不出来了,留待以后补上。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值