步骤:
1. 定义类实现Runnable接口。
2. 覆盖接口中的run方法。将线程任务代码定义到run方法中。
3. 创建Thread类的对象。
4. 将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
5. 调用Thread类的start方法开启线程。
实例:
class Demo implements Runnable{ private String name; public Demo(String name) { this.name = name; } public void run() { for (int i = 0; i < 20; i++) { System.out.println(name + ".." + Thread.currentThread().getName() + ".." + i); } } } public class ThreadDemo2 { public static void main(String[] args) { Demo d = new Demo("Demo"); Thread t = new Thread(d); Thread t2 = new Thread(d); t.start(); t2.start(); System.out.println(Thread.currentThread() .getName() + "***");//主线程一开始就执行了一次,然后就不执行了。 } }
这种方式的好处:
1. 实现Runnable接口避免了单继承的局限性,所以较为常用。
2. 实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。
继承Thread类:run方法在Thread里。线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,又有线程任务。
实现Runnable接口:run方法在Runnable里。将线程任务单独分离出来封装成对象(Runnable接口类型),用Runnable来标明线程任务,用Thread来明确线程对象。Runnable接口对线程对象和线程任务进行解耦。