方法1:使用LinkedBlockingQueue
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
public class ProviderConsumerTest{
public static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
public static void main(String[] ar){
Provider p1=new Provider();
Provider p2=new Provider();
Consumer c1=new Consumer();
Consumer c2=new Consumer();
Thread tp1=new Thread(p1);
Thread tp2=new Thread(p2);
Thread tc1=new Thread(c1);
Thread tc2=new Thread(c2);
tp1.setName("Provider1");
tp2.setName("Provider2");
tc1.setName("Consumer1");
tc2.setName("Consumer2");
tp1.start();
tp2.start();
tc1.start();
tc2.start();
}
}
class Provider implements Runnable{
Random random=new Random();
public void run(){
for(int i=0;i<5;i++){
try{
int data=random.nextInt();
ProviderConsumerTest.queue.put(data);
System.out.println(Thread.currentThread().getName()+" provide "+data);
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
Random random=new Random();
Integer data;
public void run(){
for(int i=0;i<5;i++){
try{
data=ProviderConsumerTest.queue.take();
System.out.println(Thread.currentThread().getName()+" consume "+data);
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
方法2:进程之间的通信
测试类:
package Demo6;
import java.util.LinkedList;
import java.util.Queue;
public class ConsumerProducer {//测试类不宜含有自己的变量
public static void main(String[] args) {
Object obj=new Object();
Queue<Integer>queue=new LinkedList<>();
Consumer consumer=new Consumer(obj,queue);
Producer producer=new Producer(obj,queue);
Thread thread1=new Thread(consumer);
Thread thread2=new Thread(producer);
thread1.start();
thread2.start();
}
}
消费者
package Demo6;
import java.util.Queue;
public class Consumer implements Runnable{
Object obj;
Queue<Integer>queue;
public Consumer(Object obj, Queue<Integer> queue) {
this.obj = obj;
this.queue = queue;
}
@Override
public void run() {
int i=0;
while (i<10){
synchronized (obj){
if(!queue.isEmpty()){
System.out.println(" 已经消费"+queue.poll());
i++;
obj.notify();
}
else{
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
生产者:
package Demo6;
import java.util.Queue;
public class Producer implements Runnable {
Object obj;
Queue<Integer> queue;
public Producer(Object obj, Queue<Integer> queue) {
this.obj = obj;
this.queue = queue;
}
@Override
public void run() {
int i = 0;
while (i < 10)
synchronized (obj) {
if (queue.isEmpty()) {
i++;
queue.add(i);
System.out.println("已经生产"+i);
obj.notify();
} else {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}