2016-11-13 2 views
-1

Этот вопрос немного сложный, но я сделаю все возможное, чтобы сделать его простым.Запуск многопоточной программы, синхронизированной очень медленно Java

У меня есть программа, которую я хочу запустить многопоточным.

Это то, что программа делает:

  1. инициализирует исполняемый (командной строки утилиты)
  2. загружает файл в исполняемый файл (файлы предоставляются из метода поставщика данных)
  3. посылает команды, которые исполняемый файл на основе файла, который был загружен
  4. анализирует полученные ответы от исполняемых
  5. записывает результаты в файл CSV

Все это имеет место одним способом.

Однако при работе в многопоточном режиме все работает отлично, за исключением того, что все результаты, записанные в файл csv, являются неправильными и неработоспособными.

Однако, когда я добавил ключевое слово sychronized в объявлении метода и запустил программу с несколькими потоками, программа работает нормально.

public sychronized void run(Dataprovider data) { 
    ... 
} 

Однако программа работает с такой же скоростью, как если бы я работал в режиме одиночного потока. Как я могу это исправить? Это сводит меня с ума ...

Как я могу запустить эту программу правильно многопоточно?

Я ищу идеи и/или руководства

Edit:

Однако при работе в многопоточном режиме, все работает отлично, за исключением , все результаты, записываемые в файл CSV являются неправильный и из заказ.

Загрузите файл в исполняемый файл, я запустил некоторые вычисления в этом файле, а затем сохранил его. Затем я получаю размер файла в байтах (file.length) для этого вновь созданного файла. Я сравниваю результаты этого нового файла со старым файлом (файл, который был загружен), и я вижу, что новый файл меньше старого (что совершенно неправильно). Размеры файлов для нового файла последовательно 12263 байт, что неправильно

Edit:

Вот неполный код, который делает написание в CSV-файл:

Edit: Удаление пример кода для простоты

+1

Зависит от того, что означает «все результаты, записанные в файл csv, являются неправильными и не соответствуют требованиям». –

+0

как вы работаете в многопоточном режиме? я бы ожидал, что при работе в многопоточном режиме все результаты не соответствуют порядку - как только несколько потоков запущены, они не выполняются в любом предсказуемом порядке. –

+0

@JoeC Как только я загружаю файл в исполняемый файл, я запускаю некоторые вычисления в этом файле, а затем сохраняю его. Затем я получаю размер файла в байтах (file.length) для этого вновь созданного файла. Я сравниваю результаты этого нового файла со старым файлом (файл, который был загружен), и я вижу, что новый файл меньше старого (что совершенно неправильно). –

ответ

1

Однако при работе в многопоточном режиме все работает нормально кроме, все результаты записанные в файл csv, являются неправильными и из .

Я могу рассказать о том, что вы подразумеваете под этим утверждением, но это поможет, если бы оно было более конкретным.

В этом случае результаты неверны, потому что выходы из разных потоков смешаны вместе в одну строку или даже один и тот же токен внутри линии?

В файле csv записи обычно разделяются символами новой строки. Можете ли вы реорганизовать свое решение так, чтобы поток выдавал полную строку перед записью на вывод и записывал, что строка все за один раз к выходу?

У вас уже есть решение? (Неясно ... в этом вопросе нет кода.)

+0

Я отредактировал мой вопрос, чтобы быть более понятным. Я бы предпочел не добавлять код, потому что это скорее усложнит ситуацию. Формат файла csv верен. Однако записанные на него данные не являются. Я ищу размер файла создаваемого файла, размер файла составляет 12263 байта для большинства файлов, что неверно. –

+0

Это интересное предложение, пишущее на выходе все за один раз ... Возможно, мне придется изучить это. Я думаю, что проблема в том, что у меня есть несколько файлов, которые записываются одновременно в один файл, что может вызвать конфликт. –

+0

Опять же - я не вижу код; но я начинаю подозревать, что у вас есть некоторые переменные отслеживания состояния, которые записываются (перезаписываются) несколькими потоками. –

Смежные вопросы