Приоритет потока в Java

#java #multithreading

#java #многопоточность

Вопрос:

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

Решит ли эту проблему изменение приоритета потока одного из моих потоков на более высокий, или я должен добавить AtomicBoolean для решения этой проблемы? (Проблема с AtomicBoolean заключается в том, что мне понадобится AtomicBoolean для многих, многих вещей, поскольку в обоих потоках есть много разных функций, вызывающих движение мыши)

Комментарии:

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

2. Просто чтобы уточнить: пользователь перемещает мышь, в то же время фоновый поток (или другой пользователь ??) также перемещается (захватывает) мышь?

Ответ №1:

Если вы используете один объект мыши между несколькими потоками, они должны использовать блок synchronize{} в разделе, который должен быть обработан за один выстрел. Другие потоки, которым нужен этот объект, будут ждать, если они достигнут аналогичного блока синхронизации.

 run() {
    synchronize (mouse) {
      mouse.move();
      mouse.click();
      mouse.move();
      etc();
    }
    otherStuff();
}
  

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

Комментарии:

1. Кажется, это отвечает на мой вопрос, хотя я слышал и использовал немного синхронизированных блоков, мне все еще нужно больше узнать об этом (это помогло моему сценарию прекратить проблемы с одновременным доступом к массивам). PS, должен ли я использовать синхронизированный блок в обоих моих потоках на mouse или только в одном?

2. Чтобы было ясно, синхронизация должна использоваться в каждом потоке, который использует этот объект.