日期:2014-05-20  浏览次数:20689 次

一个关于队列和线程的编程题
生成一些随机数,一个线程负责将随机数压到队列里,另外一个线程负责从队列取数据。请大侠编程指点

------解决方案--------------------
lz试试。。。

Java code

package testio;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;

public class TestList {

    private Queue<Integer> queue = new LinkedList<Integer>();

    public synchronized boolean offer(Integer i) {
        return queue.offer(i);
    }

    public synchronized Integer poll() {
        return queue.poll();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestList tl = new TestList();
        new Thread(tl.new O()).start();
        Thread t = new Thread(tl.new P());
        t.setDaemon(true);
        t.start();

    }

    class O implements Runnable {

        @Override
        public void run() {
            Random rand = new Random();
            for (int i = 0; i <= 9; i++) {
                Integer interger = rand.nextInt();
                System.out.println("offer " + interger);
                offer(interger);
            }
        }
    }

    class P implements Runnable {

        @Override
        public void run() {
            while (true) {
                Integer i;
                if ((i = poll()) != null)
                    System.out.println("poll " + i);
            }
        }

    }

}

------解决方案--------------------
Java code

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Queue{
    List<Integer> Integers = new ArrayList<Integer>();
    int maxSize = 4;
    int count = 0;
    public Queue(){
    }
    public synchronized void add(Integer e){
        
        if(Integers.size()==maxSize){
            try {
                
                this.wait();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        this.notifyAll();
        if(Integers.size()<maxSize){
            System.out.println(Thread.currentThread().getName()+ " " + e);
            Integers.add(e);
            count++;
        }
    }
    public synchronized void remove(){
        if(Integers.size()==0){
            try {
                
                this.wait();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        this.notifyAll();
        if(Integers.size()>0){
            System.out.println(Thread.currentThread().getName()+" "+this.Integers.get(0));
            Integers.remove(0);
        }
        
    }
    public static void main(String args[]){
        Queue q = new Queue();
        Create c= new Create(q);
        PullOut po = new PullOut(q);
        new Thread(c).start();
        new Thread(po).start();
    }
}
class Create implements Runnable{
    String name = "生产者";
    private Queue q;
    public Create(Queue q){
        this.q = q;
    }
    @Override
    public void run(){
        int count=0;
        Random r =new Random();
        while(count<10){
            int number = r.nextInt()%20;
            q.add(number);
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            count++;
        }
    }
}
class PullOut implements Runnable{
    String name = "消费者";
    private Queue q;
    public PullOut(Queue q){
        this.q = q;
    }
    @Override
    public void run(){
        int count=0;
        while(count<10){
            q.remove();
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            count++;
        }
    }
}