解答过程:
- 使用多线程肯定设计到共享变量,进而有并发的可能性。
- 解决并发可以使用阻塞BlockingQueue队列。
- 代码实现:
生产者:
package com.shuofeng.thread;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable{
private final BlockingQueue<Integer> queue;
public Producer(BlockingQueue q) {
this.queue = q;
}
@Override
public void run() {
try {
while(true) {
Thread.sleep(1000);
queue.put(producer());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private int producer() {
int n = new Random().nextInt(10000);
System.out.println("Thread: " + Thread.currentThread().getName()
+ "produce:"+n);
return n;
}
}
消费者:
package com.shuofeng.thread;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
private final BlockingQueue<Integer> queue;
public Consumer(BlockingQueue q) {
this.queue = q;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(2000);
consumer(queue.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void consumer(Integer n) {
System.out.println("Thread: "+ Thread.currentThread().getName()
+"consumer: "+n);
}
}
main方法:
package com.shuofeng.thread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class Main {
public static void main(String[] args) {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(100);
Producer p = new Producer(queue);
Consumer c1 = new Consumer(queue);
Consumer c2 = new Consumer(queue);
Thread producer = new Thread(p);
producer.setName("生产者线程");
Thread consumer1 = new Thread(c1);
consumer1.setName("消费者1");
Thread consumer2 = new Thread(c2);
consumer1.setName("消费者2");
producer.start();
consumer1.start();
consumer2.start();
}
}
执行结果:
Thread: 生产者线程produce:6283
Thread: 消费者2consumer: 6283
Thread: 生产者线程produce:2877
Thread: Thread-2consumer: 2877
Thread: 生产者线程produce:1094
Thread: 消费者2consumer: 1094
Thread: 生产者线程produce:8174
Thread: Thread-2consumer: 8174
Thread: 生产者线程produce:7640
Thread: 消费者2consumer: 7640
Thread: 生产者线程produce:114
Thread: Thread-2consumer: 114
Thread: 生产者线程produce:1396
Thread: 消费者2consumer: 1396
Thread: 生产者线程produce:2650
Thread: Thread-2consumer: 2650