Java多线程解析:Handler、Runnable与Thread对比

0 下载量 150 浏览量 更新于2024-08-29 收藏 88KB PDF 举报
"这篇Android开发笔记主要探讨了Handler、Runnable和Thread在实现多线程时的区别。文中通过代码示例展示了如何使用Thread类创建线程,以及为何需要调用start()方法来启动线程实现并发执行。" 在Android开发中,处理多线程是一个重要的概念,因为它涉及到应用的性能和用户体验。Java提供了两种基本的方式来创建线程:继承Thread类或实现Runnable接口。这两种方法都可以让我们在后台执行任务,从而避免阻塞主线程,保证界面的流畅响应。 首先,当我们选择继承Thread类时,我们的类会直接扩展Thread,并重写它的run()方法。例如: ```java class MyThread extends Thread { private String name; public MyThread(String name) { super(); this.name = name; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程开始:" + this.name + ", i=" + i); } } } ``` 然而,仅仅创建一个Thread对象并调用run()方法并不会启动一个新的线程。例如: ```java MyThread mt1 = new MyThread("线程a"); MyThread mt2 = new MyThread("线程b"); mt1.run(); mt2.run(); ``` 这段代码实际上是在主线程中顺序执行run()方法,没有达到并发的效果。要让线程并发执行,我们需要调用start()方法,因为start()会触发JVM创建一个新的线程并执行run()方法: ```java mt1.start(); mt2.start(); ``` start()方法内部包含了native方法,这意味着它是Java与操作系统交互的底层实现,用于实际的线程创建和调度。通过调用start(),线程会进入就绪状态,等待系统分配CPU时间片执行。 另一方面,实现Runnable接口可以避免单继承的限制,因为Java不支持多重继承。我们创建一个实现了Runnable的类,然后将其实例传递给Thread构造函数: ```java class MyRunnable implements Runnable { private String name; public MyRunnable(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程开始:" + this.name + ", i=" + i); } } } public class Main { public static void main(String[] args) { Thread mt1 = new Thread(new MyRunnable("线程a")); Thread mt2 = new Thread(new MyRunnable("线程b")); mt1.start(); mt2.start(); } } ``` 这种方式允许我们在需要多线程但又想继承其他类的情况下使用。 至于Handler,它主要用于Android中的消息传递和线程间通信,通常与Looper和Message配合使用。在主线程中,Handler可以接收由其他线程(如工作线程)发送的消息,并在适当的时间处理这些消息,保持界面更新和数据处理的同步。 总结来说,Thread是直接创建新线程的载体,Runnable是一个接口,提供了多线程实现的另一种途径,而Handler则是Android特有的,用于线程间通信和异步任务调度的工具。理解它们之间的区别和用法,对于高效地编写Android应用至关重要。