Существует ркурсивный вызов метода
private synchronized void updateData() {
List<Double> data = serialPortConnection.updateMeas();
updateImageAndChart(data);
waitDrawingImageAndChart();
if (isUpdate) {
updateData();
}
}
Использую библиотеку jssc для соединения с COM портом. Соответственно, метод отправляет устройству значение и получает на выходе массив, однако, после 2500-3000 тыс. повторов выходит
Exception in thread "Thread-7" java.lang.StackOverflowError
at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:304)
at java.lang.StringCoding.encode(StringCoding.java:344)
at java.lang.StringCoding.encode(StringCoding.java:387)
at java.lang.String.getBytes(String.java:958)
at jssc.SerialPort.writeString(SerialPort.java:377)
at ru.app.monitoring.model.device_connection.SerialPortConnection.updateMeas(SerialPortConnection.java:87)
at ru.app.monitoring.model.drawer.Drawer.updateData(Drawer.java:72)
at ru.app.monitoring.model.drawer.Drawer.updateData(Drawer.java:99)
Так вот, как можно все-такие сделать бесконечный цикл, без таких неприятных ситуаций?
Ваш код - это рекурсивная функция без без базового ограничения. При каждом вызове updateData() виртуальная машина создаёт в стековой памяти кадр для хранения локальных переменных. Стековый кадр должен уничтожаться при выходе из метода, но у вас этого никогда не происходит, так как до окончания метода он вызывается ещё раз, создавая ещё один кадр, а потом ещё и ещё. Так продолжается до тех пор, пока не будет достигнуто ограничения на размер стека. В этот момент вы и получаете исключение. Для исправления этой проблемы достаточно перенести вызов метода в цикл, тогда в стеке будет создаваться только один кадр и в конце итерации уничтожаться.
private synchronized void updateData() {
List<Double> data = serialPortConnection.updateMeas();
updateImageAndChart(data);
waitDrawingImageAndChart();
}
public static void main(String args[]) { // Или другой удобный вам метод
while(isUpdate) {
updateData();
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей