Нужны советы по созданию многопоточного многопоточного приложения - PullRequest
0 голосов
/ 23 марта 2020

У меня есть собственный проект с этой функциональностью (упрощенно):

Получение запросов пользователей -> обработка их -> отправка ответа пользователю -> добавление этого ответа на локальную карту -> запись изменений в файл.

Следующий код (не закончен, не спроектирован, просто макет):

public class MultiThreadingTest {
    public static ConcurrentMap<String, GooglePlayGame> map = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER);
    public static ObjectMapper mapper = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
            .enable(SerializationFeature.INDENT_OUTPUT);

    static {
        TypeFactory typeFactory = mapper.getTypeFactory();
        MapType mapType = typeFactory.constructMapType(ConcurrentSkipListMap.class, String.class, GooglePlayGame.class);
        try {
            ConcurrentMap<String, GooglePlayGame> temporary = mapper.readValue(new File(
                    "library.json"), mapType);
            map.putAll(temporary);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws NotGooglePlayLinkException, IOException, URISyntaxException {
        GooglePlayGame game = GooglePlayGame.builder()
                .title(parser.parseTitle(document))
                ...
                .build();

        addToLib(parser.parseTitle(document), game);
        writeToLib();

    }
    public static void addToLib(String title, GooglePlayGame game){
        map.put(title, game);
    }
    public static void writeToLib() throws IOException {
        mapper.writeValue(new File("library.json"), map);
    }
}

Теперь мое приложение работает так:

получил запрос -> получил ответ -> добавить ответ в локальную библиотеку (карта) -> записать в файл -> отправить ответ пользователю.

Я хочу ускорить этот процесс:

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

Так что мне нужен другой поток, чтобы сохранить эти ответы. Но я буквально нуб в многопоточности.

  • Должен ли я использовать где-то синхронизированный в этом случае?
  • Должен ли я создать поток с помощью executorservice или просто использовать класс анонима, который реализует Runnable, и сделать что-то вроде этого:
Thread thread = new Thread(() -> writeToLib());
thread.start();
  • Что если я не хочу записывать в файл каждый ответ, но если я получил 3 ответа, то записать в файл? Что я должен использовать для этого?
  • Thread-safe? Я не должен пропустить ни одного запроса (я имею в виду, что все ответы должны быть написаны).

Поэтому главная цель - добавить / написать в библиотеку / файл в другом потоке и не тратить на это время пользователей. Они должны получать быстрые ответы на свои запросы.

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