Я подозреваю, что использование очереди блокировки блокирует настолько, что вызывает замедление.
Вы подозреваете, что это неправильно. Следующая тестовая программа проталкивает 1 миллион целых чисел через ArrayBlockingQueue:
public class ArrayBlockingQueuePerfTest {
int maxi = 1000000;
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1000,
true);
Thread sender = new Thread("sender") {
public void run() {
try {
for (int i = 0; i < maxi; i++) {
queue.offer(i, 1, TimeUnit.SECONDS);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
};
};
Thread receiver = new Thread("receiver") {
public void run() {
try {
int count = 0;
long sum = 0;
while (count < maxi) {
sum += queue.poll(1, TimeUnit.SECONDS);
count++;
}
System.out.println("done");
System.out.println("expected sum: " + ((long) maxi) * (maxi - 1) / 2);
System.out.println("actual sum: " + sum);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
};
};
public ArrayBlockingQueuePerfTest() {
sender.start();
receiver.start();
}
public static void main(String[] args) {
new ArrayBlockingQueuePerfTest();
}
}
На моем ноутбуке он заканчивается через пару секунд. Поэтому, где бы ни было ваше узкое место в производительности, это не ArrayBlockingQueue, который может обрабатывать пропускную способность как минимум на 3 порядка выше, чем вам нужно. Иными словами, даже если вы нашли подход к обмену потоками, который вообще не требует времени выполнения, это только ускорит вашу программу максимум на 0,1%.
Возьмите домашний урок для решения этой и всех других проблем с производительностью. Первый шаг при решении любой проблемы с производительностью в существующем коде - измерить, какая часть кода медленная , как обычно, это не где надеется. Профилировщики значительно упрощают эту задачу.