|
实现Runnable接口 使用继承方式有一个弊端,那就是如果该类本来就继承了其他父类,那么就无法通过Thread类来创建线程了,这样就有了第二种创建线程的方式:实现Runnable接口。 步骤: a, 定义类实现Runnable的接口。 b, 覆盖Runnable接口中的run方法。目的也是为了将线程要运行的代码存放在该run方法中。 c, 通过Thread类创建线程对象。 d, 将Runnable接口的子类对象作为参数传递给Thread类的构造方法。 e, 调用Thread类中start方法启动线程。start方法会自动调用Runnable接口子类的run方法。 实现Runnable接口好处:java是单继承多实现,使用实现Runnable接口的方式避免了单继承的局限性。在定义线程时,建议使用实现Runnable接口方式。 使用实现Runnable接口的方式实现相同的功能。 /* * 示例:创建三个线程,每过2秒打印一下线程的名称,共打印三次 * */ class ThreadTestWin implements Runnable{ private final int MAX = 3;//最大打印次数 private int COUNT = 1;//计数 private final int TIME = 2;//间隔时间 private String NAME; public ThreadTestWin(String name) { this.NAME = name; } public String getName() { return this.NAME; } //覆盖run方法,在里面写我们要执行的代码 public void run() { while(COUNT<= MAX){ System.out.println(this.getName()); COUNT++; //每次打印后,在间隔时间后再打印 try { Thread.sleep(TIME*1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
class Thread2{ public static void main(String[] args) { Thread t1 = new Thread(new ThreadTestWin("线程1"));//创建线程 Thread t2 = new Thread(new ThreadTestWin("线程2")); Thread t3 = new Thread(new ThreadTestWin("线程3")); t1.start(); //开启线程 t2.start(); t3.start(); //也可以使用下面这种方式书写 //new Thread(new Thread2("线程4")).start(); } } 为什么将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数? 因为要被多线程执行的代码都存放了Runnable接口的子类中,所以必须要明确线程对象要执行的run方法所属的对象。
两种实现方式的区别: a,继承Thread:线程代码存放在Thread子类run方法中; 实现Runnable:线程代码存放在接口子类run方法中。 b,实现Runnable接口是可以将资源共享。 c,实现Runnable接口避免了单继承的局限性 。 所以建议使用实现Runnable接口的方式来创建线程。
|