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

来源:互联网 发布:公务员考试网络课程 编辑:程序博客网 时间:2024/05/16 17:24

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

模拟线程间通信:线程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 stubResource 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 blocke.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 blocke.printStackTrace();}}System.out.println("消费第" + i + "资源");object[--i] = null;this.notify();}}class TheadProducer implements Runnable{Resource resource;public TheadProducer(Resource r){this.resource = r;};@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0; i < 1000; i++)resource.produce();}}class ThreadComsumer implements Runnable{Resource resource;public ThreadComsumer(Resource r){this.resource = r;};@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0; i < 1000; i++)resource.comsumer();}}
这是JAVA的实现,由此可以引伸出如何用C实现,在windows下肯定要用到windowsAPI了。对windowsAPI的使用不多,尤其对于线程通信的API,还没有详细研究,现在肯定是写不出来了,留待以后补上。。。

原创粉丝点击