asynchronous communication between the threads. This ensures that they never block each other. - Batched: It transfers messages from one thread to the other in an optimised way. - Serializable: The two threads never share or operate with the same data. Instead, they exchange serialized messages.