继承Thread类、实现Runnable接口
一、继承Thread类
1、继承Thread类,并重写run()方法;
把要执行多线程的代码放在run方法代码块中。
2、创建子类MyThread对象就是创建线程对象;
3、调用MyThread1.start()方法启动线程。
调用start()方法其实就是调用父类Thread类中的start()方法,这个方法是开启线程的作用。让开启的线程去执行run()方法。
如果直接跳过start直接调用run()方法,线程并未开启,去执行run()方法的只有主线程!
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
二、实现Runnable接口
1、定义一个类实现Runnable接口;(解耦,任务单独封装,Runnable接口中有run方法)
2、覆盖Runnable接口中的run()方法。将要执行的任务代码存在run方法中;
3、通过Thread类创建线程对象,并将实现Runnable接口的对象作为Thread类的构造方法的参数进行传递;
4、调用Thread对象的start()方法开启线程。
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
三、实现Runnable接口的好处
1、避免了继承Thread类的单继承的局限性;
2、Runnable接口降低了线程对象和线程任务的耦合性;
3、Runnable接口的出现更符合面向对象思想,将线程任务单独封装。