Thread allows running code on a background thread but cannot directly update the UI. Handler allows scheduling messages and runnables to execute on a thread's message queue. AsyncTask simplifies background threading by running background work on a separate thread and publishing results on the UI thread.