Q.怎么去实现使用独立的进程去生成奇偶数,然后另一个线程打印出奇偶数之和?
A.可以通过多线程以及BlockingQueue来实现。队列是先进先出的数据结构。
阻塞队列有以下特性
1.线程从空队列中获取时,只有在其他线程往队列中放入有效数据后才会返回,否则阻塞
2.线程往一个已满队列中放数据时,只有其他线程取出数据腾出空间,或者其他线程清空了队列以后才会添加成功,否则阻塞
下面是奇偶数生成类
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class NumberWriter extends Thread {
private BlockingQueue<Integer> queue;
private int maxNumber;
private boolean isEvenNumber;
public NumberWriter(BlockingQueue<Integer> queue, int maxNumber, boolean isEvenNumber) {
this.queue = queue;
this.maxNumber = maxNumber;
this.isEvenNumber = isEvenNumber;
}
public void run() {
int i = 1;
while (i <= maxNumber) {
try {
if (isEvenNumber && (i % 2) == 0) {
queue.put(i); // enqueue
} else if (!isEvenNumber && i%2 != 0) {
queue.put(i);
}
++i;
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
public static void main(String[] args) {
final int MAX_NUM = 100;
BlockingQueue<Integer> oddNumberQueue = new ArrayBlockingQueue<Integer>(10);
BlockingQueue<Integer> evenNumberQueue = new ArrayBlockingQueue<Integer>(10);
NumberWriter oddGen = new NumberWriter(oddNumberQueue, MAX_NUM, false);
NumberWriter evenGen = new NumberWriter(evenNumberQueue, MAX_NUM, true);
NumberReceiver receiver = new NumberReceiver(oddNumberQueue, evenNumberQueue);
oddGen.start();
evenGen.start();
receiver.start();
}
}
线程会汇总奇偶数之和,然后将结果打印出来
import java.util.concurrent.BlockingQueue;
public class NumberReceiver extends Thread {
private BlockingQueue<Integer> oddNumberQueue;
private BlockingQueue<Integer> evenNumberQueue;
public NumberReceiver(BlockingQueue<Integer> oddNumberQueue,
BlockingQueue<Integer> evenNumberQueue) {
this.oddNumberQueue = oddNumberQueue;
this.evenNumberQueue = evenNumberQueue;
}
public void run() {
int odd = 0, even = 0;
try {
while (odd != -1) {
odd = oddNumberQueue.take(); //dequeue - FIFO
even = evenNumberQueue.take(); //dequeue - FIFO
if ((odd + even) % 5 == 0) {
System.out.println("match found " + odd + " + " + even
+ " = " + (odd + even));
}
}
} catch (InterruptedException ie) {
ie.printStackTrace();
System.exit(1);
}
}
}
输出结果:
match found 7 + 8 = 15
match found 17 + 18 = 35
match found 27 + 28 = 55
match found 37 + 38 = 75
match found 47 + 48 = 95
match found 57 + 58 = 115
match found 67 + 68 = 135
match found 77 + 78 = 155
match found 87 + 88 = 175
match found 97 + 98 = 195