Что ж, если вам нужна только последняя созданная строка, то вам вообще не нужна очередь - все, что вам нужно, - это ссылка на строку: производитель устанавливает ее, а потребитель читает ее. Если потребитель читает так долго, что производитель переустанавливает его ... ну и что?
Установка и чтение ссылок являются атомарными. Единственная проблема - если вы хотите, чтобы потребитель как-то был уведомлен о наличии доступной строки. Но даже тогда ... если потребитель делает что-то, что занимает какое-то время, тогда вам действительно не нужны какие-то модные штучки из библиотек параллелизма.
Обратите внимание, что этот пример работает с любым количеством потоков производителей и / или потребителей.
import java.util.Random;
public class Example {
public static void main(String[] av) {
new Example().go();
}
Object mutex = new Object();
String theString = null;
void go() {
Runnable producer = new Runnable() {
public void run() {
Random rnd = new Random();
try {
for (;;) {
Thread.sleep(rnd.nextInt(10000));
synchronized (mutex) {
theString = "" + System.currentTimeMillis();
System.out.println("Producer: Setting string to " + theString);
mutex.notify();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable consumer = new Runnable() {
public void run() {
try {
String mostRecentValue = null;
Random rnd = new Random();
for (;;) {
synchronized (mutex) {
// we use == because the producer
// creates new string
// instances
if (theString == mostRecentValue) {
System.out.println("Consumer: Waiting for new value");
mutex.wait();
System.out.println("Consumer: Producer woke me up!");
} else {
System.out.println("Consumer: There's a new value waiting for me");
}
mostRecentValue = theString;
}
System.out.println("Consumer: processing " + mostRecentValue);
Thread.sleep(rnd.nextInt(10000));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Thread(producer).start();
new Thread(consumer).start();
}
}