请用Java语言实现一个队列,该队列可在多线程环境下使用,多个线程可并发向队列插入数据或读取数据。
另外再给出访问这个队列的多线程实现类。
------解决方案--------------------
- 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++; } }}