#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. Чтобы было ясно, синхронизация должна использоваться в каждом потоке, который использует этот объект.