Java开发中,我们实现多线程,有两种方式, 一种是继承Thread类,一种是实现Runnable接口。但是,我们真的理解Runnable?Runnable和Thread一样吗?都是开启新的线程吗? 为何明明在子线程使用Handler的post(Runnable),最终还是在主线程中执行呢?...带着这些疑问,我们来开始今天的博文。本文的例子是基于Android Studio。
1、继承Thread类
- public class MyThread extends Thread {
- private String name;
- public MyThread(String name) {
- this.name = name;
- }
- @Override
- public void run() {
- System.out.println("MyThread is " + name);
- }
- }
2、启动该线程,运用Thread的start方法
- public class Test1 {
- public static void main(String[] args){
- MyThread myThread1=new MyThread("线程1");
- MyThread myThread2=new MyThread("线程2");
- MyThread myThread3=new MyThread("线程3");
- myThread1.start();
- myThread2.start();
- myThread3.start();
- System.out.println("myThread1 id ="+myThread1.getId());
- System.out.println("myThread1 id ="+myThread2.getId());
- System.out.println("myThread1 id ="+myThread3.getId());
- }
- }
二、实现runnable接口
- public interface Runnable{
- public void run();
- }
因为runnable里边没有start方法,所以需要重新启动, 所以,即使实现了Runnable接口,那也无法启动线程,必须依托其他类。而Thread类,有一个构造方法,参数是Runnable对象,也就是说可以通过Thread类来启动Runnable实现的多线程。
- public Thread(Runnable target) {
- init(null, target, "Thread-" + nextThreadNum(), 0);
- }
所以,实现Runnable接口后,需要使用Thread类来启动。
创建一个类MyRunnable,实现Runnable接口,
- ublic class MyRunnable implements Runnable {
- private String name;
- public MyRunnable(String name) {
- this.name = name;
- }
- @Override
- public void run() {
- System.out.println("MyRunnable is " + name);
- }
- }
下面是调用以及启动线程并打印线程的id,启动线程还是调用Thread类的start()方法,
- public class Test1 {
- public static void main(String[] args){
- MyRunnable myRunnable1=new MyRunnable("Runnable1");
- MyRunnable myRunnable2=new MyRunnable("Runnable2");
- MyRunnable myRunnable3=new MyRunnable("Runnable3");
- Thread myThread1=new Thread(myRunnable1);
- myThread1.start();
- System.out.println("myThread1 id ="+myThread1.getId());
- Thread myThread2=new Thread(myRunnable2);
- myThread2.start();
- System.out.println("myThread1 id ="+myThread2.getId());
- Thread myThread3=new Thread(myRunnable3);
- myThread3.start();
- System.out.println("myThread1 id ="+myThread3.getId());
- }
- }
小结:通过上面的两个小例子程序,我们可以得知,只是实现Runnable接口,并不能启动或者说实现一个线程。Runnable接口,并不能代表一个线程。Runnable接口和线程是两个不同的概念!
换句话说,一个类,实现Runnable接口,这个类可以做很多事情,不仅仅只被用于线程,也可以用于其他功能!