Developer here.
One thread can raise an event which is read by the main executing thread. These events are subscribed to by executing code (it doesn't matter what thread they are on). When it hears the event being fired it picks up any parameters that are passed over by that event and acts on it.
The event handler is known as a delegate.
EDIT: Also, CPU cores have NOTHING to do with threads. I wish people would stop thinking this.