Данные ThreadpoolExecutor перепутаны - PullRequest
0 голосов
/ 07 сентября 2018

Я использую платформу для выполнения пулов потоков Android (инициализирован, как показано ниже).

BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<>();
ExecutorService executorService = new ThreadPoolExecutor(totalCores, totalCores * 3, 10, TimeUnit.SECONDS, taskQueue);

Теперь рассмотрим следующую функцию onFrameProcessed -

public void onFrameProcessed(RenderedImage renderedImage) {
String timeNow = new SimpleDateFormat("d-M-Y_HH_mm_ss_SSS").format(new Date()).toString();
CustomRunnable3 customRunnable3 = new CustomRunnable3(renderedImage, timeNow);
executorService.execute(customRunnable3);
}

Определение CustomRunnable3 выглядит следующим образом:

class CustomRunnable3 implements Runnable {
    RenderedImage renderedImageLocal;
    String basePath, timeNowCopy;
    int hashCode;

    CustomRunnable3(RenderedImage renderedImage, String timeNow) {
        renderedImageLocal = renderedImage;
        this.basePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
        this.timeNowCopy = timeNow;
        hashCode = renderedImageLocal.hashCode();
    }

    @Override
    public void run() {
        if (renderedImageLocal.imageType() == RenderedImage.ImageType.ThermalRadiometricKelvinImage) {
            int[] thermalData = renderedImageLocal.thermalPixelValues();
            String dataPath = basePath + "/" + this.timeNowCopy + ".csv";
            try {
                PrintWriter printWriter = new PrintWriter(dataPath);
                int dataLen = thermalData.length;
                for (int i = 0; i < dataLen; i++) {
                    printWriter.println(thermalData[i]);
                }
                printWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            String imgPath = basePath + "/" + this.timeNowCopy + ".jpg";
            try {
                if (hashCode != renderedImageLocal.hashCode()) {
                    Log.e("Checking", "Hash code changed..");
                }
                renderedImageLocal.getFrame().save(new File(imgPath), frameProcessor);
                if (hashCode != renderedImageLocal.hashCode()) {
                    Log.e("Checking", "Hash code changed after writing..");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

Сценарий использования : onFrameReceived вызывается несколько раз в секунду (например, 4-5 раз). При каждом вызове onFrameReceived я сохраняю два файла из объекта RenderedImage (1 CSV-файл, 1 JPG-файл). Оба эти файла должны быть связаны друг с другом, потому что оба они созданы от одного родителя и имеют одинаковое имя (кроме расширения).

Проблема : Но этого не происходит, и я каким-то образом получаю содержимое файла jpg из 1 renderedImage и содержимое csv из другого объекта renderderedImage. Каковы возможные причины этой проблемы, пожалуйста, поделитесь своим мнением.

...