In most of the cases, there is no need to program low-level synchronization to support
thread interaction - there are complete solutions.
First of all, one can use different kinds of Queues from java.util and java.util.concurrent.
For launching background thread from Swing, class javax.swing.SwingWorker can be used.