Параллельные вычисления RecursiveAction
Я получаю данные с каншины автомобиля, в большом объеме и несколько раз за секунду. Код "получения" простой
private final UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
@Override
public void onReceivedData(byte[] arg0) {
try {
SqrtTransform task = new SqrtTransform(arg0);
task.invoke();
if (mHandler != null) {
mHandler.obtainMessage(MESSAGE_FROM_SERIAL_PORT, arg0).sendToTarget();
}
} catch (NullPointerException | InternalError e) {
}
}
};
Мне за один раз приходит массив byte. содержащий несколько сообщений (1 сообщение - 16 байт данных). Через SqrtTransform task я сделал распараллеливание вычислений и обработки
class SqrtTransform extends RecursiveAction {
byte[] data;
SqrtTransform(byte[] arg00) {
data = arg00;
}
protected void compute() {
try {
if (data.length == 16) {
_send_ID_byte(data);
} else {
// Здесь разбиваем на маленькие части
// так неправильно и не работает параллельность
int i2 = 0;
while (i2 < data.length / 16) {
invokeAll(new SqrtTransform(Arrays.copyOfRange(data, i2 * 16, 16 + i2 * 16)));
++i2;
}
// так правильно и работает параллельность. Пример чисто теоретический
invokeAll(new SqrtTransform_byte(Arrays.copyOfRange(data, 0 * 16, 16 + 0 * 16)),
new SqrtTransform_byte(Arrays.copyOfRange(data, 1 * 16, 16 + 1 * 16)),
new SqrtTransform_byte(Arrays.copyOfRange(data, 2 * 16, 16 + 2 * 16)));
}
} catch (RuntimeException e) {
}
}
}
Здесь _send_ID_byte(data) это дальнейшая конечная обработка сигнала, с расшифровкой и записью по нужным данным, с несколькими отдельными функциями.
Правильно я оформил код? И будут ли функции в _send_ID_byte(data) так же выполняться в параллельном потоке?
P.S. Код немного неверный, внёс исправления