今日,在网上搜到一篇讲述在腾讯面经。里面有道题,考的是生产者消费者问题。题目如下:
模拟线程间通信:线程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,还没有详细研究,现在肯定是写不出来了,留待以后补上。。。