方式一:利用阻塞队列来实现
生产者:
improt java.util.Random;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable{
private final BlockingQueue<Integer> queue;
private String name;
public Producer(BlockingQueue<Integer> queue, String name){
this.queue = queue;
this.name = name;
}
@Override
public void run(){
while(true){
try{
Thread.sleep(1000);
queue.put(producer());
}catch(Exception e){
e.printStackTrace();
}
}
}
private int producer(){
int n = new Random.nextInt(1000);
System.out.println("Thread: "+name + "Producer: " + n);
return n;
}
}
消费者:
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable{
private String name;
private BlockingQueue<Integer> queue;
public Consumer(BlockQueue<Integer> queue, String name){
this.queue = queue;
this.name = name;
}
@Overrider
public void run(){
try{
Thread.sleep(1000);
cusumer(queue.take());
}
catch(Exception e){
e.printStackTrace();
}
}
public void consumer(Integer n){
System.out.println("Thread : " + name + "Consumer" +n );
}
}
测试:
public static void main(String args[]){
BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(5);
Producer p = new Producer(queue, "生产者");
Consumer c1 = new Consumer(queue, "消费者1");
Consumer c2 = new Consumer(queue, "消费者2");
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
方式二:利用wait()和notify()方法
生产者:
import java.util.Queue;
import java.util.Random;
public class Producer implements Runnable{
private int size;
private Queue<Integer> queue;
public Producer(Queue<Integer> queue, itn size){
this.queue = queue;
this.size = size;
}
@Override
public void run(){
while(true){
synchronized(queue){
while(queue.size == size){
System.out.println("Queue is Full");
try{
queue.wait();
}catch(Exception e){
e.printStackTrace();
}
}
Random random = new Random();
int i = random.nextInt();
System.out,println("生产者:"+i);
queue.add(i);
queue.notifyAll();
}
}
}
}
消费者:
import java.util.Queue;
public class Consumer implement Runnable{
private Queue<Integer> queue;
private int size;
public Consumer(Queue<Integer> queue, int size){
this.queue = queue;
this.size = size;
}
@Override
public void run(){
while(true){
synchronized(queue){
while(queue.isEmpty){
System.out.println("Queue is Empty");
try{
queue.wait();
}catch(Exception e){
e.printStackTrace();
}
}
int v = queue.remove();
System.out.println("消费者: " +i);
queue.notifyAll();
}
}
}
}
测试:
public static void main(String args[]){
Queue<Integer> queue = new LinkedList<>();
int size = 10;
Producer p = new Producer(queue, size);
Consumer c1 = new Consumer(queue, size);
Consumer c2 = new Consumer(queue, size);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}