В Java предпочтительным способом является простой доступ к полям из одного потока в другой с правильной синхронизацией.
Синхронизация очень важна, поскольку это единственный способ гарантировать, что значение, записанное одним потоком, будет видно другим (как указано в модели памяти Java). Это может быть достигнуто с помощью ключевого слова synchronized в методах, которые обращаются к общему полю (грубые блокировки, например: public synchronized void getMyField ()), или путем явной блокировки на некоторые более тонкие блокировки - которые могут быть либо блокировками каждый объект имеет внутреннюю (например, синхронизированную (myObject)) или специализированные блокировки, предоставляемые пакетом java.util.concurrent (ReadWriteLock и т. д.).
Для координации между потоками используйте барьеры, очереди и все приятные конструкции, также доступные в пакете java.util.concurrent.
Если вы хотите узнать больше обо всем этом, я предлагаю вам прочитать эту книгу:
http://www.javaconcurrencyinpractice.com/