Я работаю над графическим приложением Java. На каком-либо событии (например, нажатие кнопки) я хочу прочитать большое количество данных из файла в новом рабочем потоке и сохранить его в общей переменной. Затем из этого рабочего потока я хочу вызвать EDT (Event Dispatching Thread) и использовать данные.Последовательное использование общей переменной в Java
Нет одновременного доступа к данным - просто создайте данные в одном потоке и по завершении используйте его в другом потоке.
Я не уверен, что при вызове EDT из рабочего потока убедитесь, что EDT увидит обновленные данные или, если возможно, что EDT будет работать только с какой-то старой версией.
Я не хочу вдаваться в использование изменчивых полей и синхронизированных коллекций из-за сложной структуры моего класса данных и потому, что я не хочу делать свой код медленнее, используя ненужную синхронизацию.
псевдокод пример:
EDT: MyType data;
EDT: start new Worker thread;
Worker: loadDataFromFileInNewThread(data);
Worker: invokeEDT; //using java.awt.EventQueue.invokeLater
EDT: use data;
Является ли это использование разделяемой памяти в порядке или я должен заставить EDT использовать обновленную версию так или иначе?
Жаль, что это неправильно документировано. Я ожидаю, что он будет работать нормально. Но, конечно, вы могли бы просто обновить изменчивую переменную или AtomicReference.Чтение изменчивой переменной не окажет существенного влияния на производительность приложения. Чтение большого файла: как на луну и вернуться. Чтение AtomicReference: как мигание глаз. –
вы можете использовать будущий и исполняющий, чтобы получать данные в будущем объекте, это даст вам возможность узнать, когда ваши данные будут полностью прочитаны в рабочем потоке, так что вы можете что угодно в нем –
FYI, invokeLater doesn 't_start_ EDT. EDT уже запущен, ожидая событий. Это должно быть так, потому что ваша программа уже нажала кнопку. Когда вы хотите, чтобы EDT что-то сделал, вы _post событие_. Метод invokeLater() публикует событие общего назначения, не относящееся к GUI, которое в основном означает _do this ..._. –