У меня есть задача, которая сжимает изображение, которое использует много многократных циклов внутри него:
private void writeCompressedData() {
int i, j, r, c, a, b;
loat[][] inputArray;
for (r = 0; r < minBlockHeight; r++) {
for (c = 0; c < minBlockWidth; c++) {
xpos = c * 8;
pos = r * 8;
for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {
inputArray = (float[][]) jpegObj.components[comp];
for (i = 0; i < jpegObj.VsampFactor[comp]; i++) {
for (j = 0; j < jpegObj.HsampFactor[comp]; j++) {
xblockoffset = j * 8;
yblockoffset = i * 8;
for (a = 0; a < 8; a++) {
for (b = 0; b < 8; b++) {
// Process some data and put to inputArray
}
}
// Encode Huffman block
}
}
}
}
}
}
Я запускаю этот метод в нормальном потоке, например:
new Thread(new Runnable() {
@Override
public void run() {
writeCompressedData();
}
});
Илизапустить в фоновом рабочем потоке
TaskExecutor.queueRunnable(new Runnable() {
@Override
public void run() {
writeCompressedData();
}
});
Проблема в том, что этот метод иногда работает неправильно и вызывает бесконечные циклы при получении неверного ввода. В этом случае он будет работать вечно, и будет вредить процессору, даже когда экран устройства отключит , что приведет к повышению температуры устройства (и если я использую рабочий поток, он также блокирует другие задачи в очереди ожидания).
Я думаю, мне нужно установить тайм-аут, чтобы завершить долгосрочную задачу. Каков наилучший способ добиться этого в обычном потоке Java? Поддерживает ли это RxJava?
Я знаю, что мне нужно исправить это «неправильный» метод, а не просто прекратить его. Но для больших приложений трудно контролировать код другого разработчика, и первое, что мне нужно, это избегать воздействия на пользователей.