Short answer: yes
Long answer: @acj answer is a good short and concise explanation of the specifics of Handler / Looper / MessageQueue. However, it does miss couple of points.
Each thread can have associated message queue, where messages sent to it are stored until the thread gets to execute them. The messages are processed sequentially in a loop running on the thread. Other threads can post messages into the queue; however, the message processing is asynchronous, and the other threads are typically not blocking on it.
There are number of standardized messages (like the Runnable message) which are executed by the OS implementation of the loop. However, the application code might support processing custom messages as well.
Handler is just a handy way for posting messages to the message queue for particular thread (typically the thread the Handler object is created on) from other threads. Note that Handler can be used in-process only, and in a single process all memory is common across all threads, so the message queue does not need to be kept in "shared memory" (that term is used for memory regions accessible by multiple processes usually).
One specific thing to keep in mind with all this is that posting a message using a Handler does not guarantee it's processing. It's possible for the thread to exit for any number of reasons before it gets to your message.