Если это всего лишь одноразовая вещь - вы получаете 40 или около того двойников, и хотите начать обработку нового потока, тогда вы можете сделать это следующим образом:
public void callback(final double[] myDoubles)
{
new Thread(){
public void run() {
// you can use myDoubles here. it will run on a separate thread.
}}.start()
};
Если это часто случается, вам нужно просмотреть пулы потоков и использовать java.utils.concurrent.BlockingQueue . Несмотря на имя, очередь будет блокироваться только в том случае, если заполнится.
Вы можете создать массив, удваивающий соответствующий размер, который ваш метод обратного вызова помещает в очередь. Операция put () выполняется очень быстро, поэтому ваш метод обратного вызова не будет задерживаться надолго. (если очередь не заполнена.)
Ваш другой поток будет использовать метод take () в очереди, чтобы получить объект, когда объект доступен. Метод take () блокируется до тех пор, пока объект не станет доступен - если вы этого не хотите, но предпочитаете, чтобы поток работал, занимаясь другими делами, тогда используйте poll ().
И последнее, на что нужно обратить внимание: вы хотите, чтобы только один рабочий поток обрабатывал удвоения из обратного вызова, или вы хотите несколько? Наличие одного потока имеет смысл, когда работа должна выполняться по одному - например, если вы записываете массив в файл, обычно нет смысла делать это несколькими потоками. Но если работа над каждым массивом независима, то это хороший вариант для нескольких рабочих потоков.