Сколько времени сна хорошо для двух потоков, работающих одновременно - PullRequest
0 голосов
/ 02 октября 2018

Я пишу код для чтения большого файла JSON и записи данных в базу данных.Я вращаю 2 потока, один для чтения из файла (смешанный режим steam и чтение объекта один за другим с помощью Gson), помещая объект в очередь блокировки, а второй поток считывает данные из очереди и сохраняет в db, используя размер пакета 1000. Я не сделалне помещайте таймер сна в поток 1, с другой стороны, поток 2 использует sleep (200) непосредственно перед сохранением данных.

Мне было интересно, будет ли полезно поставить сон на 10-20 миллисекундв теме 1 тоже?Помогает ли это с точки зрения производительности переключаться между потоками с помощью режима сна?

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

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

0 голосов
/ 03 октября 2018

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

Даже с одним ядром вам не нужно sleep.Пусть ваш синтаксический анализатор put целых пакетов в очереди, пусть ваш DB DB Writer take их.Я бы выбрал размер очереди два, так что БД невероятно бездействует.

Поскольку соединение JDBC является синхронным, пишущий БД, вероятно, тратит большую часть времени на ожидание транзакции.

0 голосов
/ 03 октября 2018

Я не Java-разработчик, но принципы те же.

  1. Не использовать сны.
  2. Использовать шаблон производитель-потребитель.

В шаблоне "производитель-потребитель" 1-й поток (производитель) читает данные из JSON как можно быстрее и помещает их в безопасную для потока очередь, из которой 2-й поток (потребитель) читает их.

Упрощенный алгоритм.

Поток производителя.

  1. Чтение данных из файла JSON.
  2. Запись данных чтения в очередь.
  3. Установка события синхронизации для уведомления потока потребителя.
  4. Перейти к 1.

Поток потребителя.

  1. Дождаться установки события синхронизации.
  2. Считать данные из очереди.
  3. Сохранение данных в БД.
  4. Если очередь не пуста, переходите к 2, иначе переходите к 1.

Производитель-потребитель - это хорошо известный шаблон, так что это не сложночтобы найти такие же примеры в Java.Например, посмотрите здесь .

0 голосов
/ 02 октября 2018

Трудно что-то сказать о производительности без запуска тестов, но ... в принципе, вам вообще не нужно sleep() (производитель заблокирует, если очередь заполнена, и потребитель, если она пуста).

Вы можете использовать yield(), чтобы намекнуть, что текущий поток достиг точки, где было бы неплохо переключиться на другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...