Непредсказуемое значение при преобразовании массива байтов в int | Затмение Темурина-17.0.10+11JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Непредсказуемое значение при преобразовании массива байтов в int | Затмение Темурина-17.0.10+11

Сообщение Anonymous »

Постановка проблемы:
Я столкнулся с проблемой при запуске следующей многопоточной программы. Программа порождает большое количество потоков (10 000), которые обрабатывают одно и то же значение массива байтов. Проблема усугубляется при высокой загрузке ЦП и при применении ограничений памяти (например, установка -Xms32m -Xmx32m).
Метод byteArrayToInt предназначен для преобразования определенного сегмента байтового массива. в целое число. Однако периодически он выдает неправильные значения. Ожидаемое значение для liVersion равно 1, но вместо этого наблюдаются случайные значения. Эта проблема возникает, даже если программа выполняется с достаточным объемом памяти и меньшим количеством потоков (даже с одним потоком), но становится значительно реже.
Целочисленное преобразование 2-го в 4-е значение pTestData, которое is [1, 0] должно быть равно 1, но оно периодически выдает случайные значения на выходе.
Среда:
Операционная система: Windows 10
Java-версия: Eclipse Temurin-17.0.10+11
Фрагмент кода:

Код: Выделить всё

import java.util.Arrays;

public class TestMain
{
private static int miParallelThreadCount = 10000;

private static long mlExecutionIntervalInMillis=100;

public static void main(String[] args)
{
System.out.println("Startin tornado at interval: " + mlExecutionIntervalInMillis + " with parallel threads: " + miParallelThreadCount);
while(true)
{
//Runs the test code to reproduce the issue
runTornado();
try
{
Thread.sleep(mlExecutionIntervalInMillis);
} catch (Throwable lThrowable)
{
System.out.println("Task failed due to: " + lThrowable.getLocalizedMessage());
lThrowable.printStackTrace();
}
}
}

private static void runTornado()
{
//Test byte array
byte[] data = new byte[]
{ 65, 50, 1, 0, 1, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 53, -76, -66, 125, -115, 69, -111, 80, -81, -33, -62, 84, -59, -64, -114, 113, -92, -59, 37, 106, 85, -111, -100, -19, 114, 99, 18, -9, -62, -123, -75, -22, -40, 70, -70, -46, 119, 11, -17, -71, -93, -126, -28, 116, 104, -4, -45, -58, 121, 4, 50, 76, 46, 13, -91, -76, 37, -103, 101, 57, 54, 75, 83, -124 };

for(int i=0; i
{
try
{
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
}
catch (Throwable lThrowable)
{
System.out.println("Something went wrong: " + lThrowable.getLocalizedMessage());
lThrowable.printStackTrace();
}
}).start();
}
System.out.println("Ran tornado");
}

private static byte[] compareInner(byte[] pTestData, int pStartIndex, int pLength)
{
//Copies the pTestData into new array as it is
byte[] lbarrData = Arrays.copyOfRange(pTestData, 0, 0 + pTestData.length);
//copies only 2ndand 3rd element from the array which is [1, 0]
byte[] lbarrVer = Arrays.copyOfRange(lbarrData, 2, 4);

//Converts the array [1, 0] into integer, which should always return 1
int liVersion = byteArrayToInt(lbarrVer);

if(liVersion != 1)
{
System.out.println("Invalid Version : " + liVersion + " data array: " + Arrays.toString(lbarrData) +  " header array: " + Arrays.toString(lbarrVer));
}

return lbarrData;
}

public static final int byteArrayToInt(byte[] pSource)
{
int lValue = 0;
for (int i = 0; i < pSource.length; i++)
{
lValue += (pSource[i] & 0xff) 

Подробнее здесь: [url]https://stackoverflow.com/questions/79305907/unpredictable-value-when-converting-byte-array-to-int-eclipse-temurin-17-0-10[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»