Runnable接口实现多线程
在上一节案例中,通过继承Thread类的方式实现了多线程,但这种方式有一定的局限性,因为Java只支持类的单继承,如果某个类已经继承了其他父类,就无法再继承Thread类来实现多线程。在这种情况下,就可以考虑通过实现Runnable接口的方式来实现多线程。
使用实现Runnable接口的方式来实现多线程的主要步骤如下:
(1)创建一个Runnable接口的实现类,同时重写接口中的run()方法;
(2)创建Runnable接口的实现类对象;
(3)使用Thread有参构造方法创建线程实例,并将Runnable接口的实现类的实例对象作为参数传入;
(4)调用线程实例的start()方法启动线程。
接下来通过一个案例来演示如何通过实现Runnable接口的方式来实现多线程,如文件1所示。
文件1 Example02.java
1 //1、定义一个实现Runnable接口的实现类
2 class MyThread2 implements Runnable {
3 // 1.1、重写Runnable接口的run()方法
4 public void run() {
5 int i=0;
6 while (i++ <5) {
7 System.out.println(Thread.currentThread().getName()
8 +"的run()方法在运行");
9 }
10 }
11 }
12 public class Example02 {
13 public static void main(String[] args) {
14 // 2、创建Runnable接口实现类的实例对象
15 MyThread2 myThread2 = new MyThread2();
16 // 3、使用Thread(Runnable target, String name)构造方法创建线程对象
17 Thread thread1 = new Thread(myThread2,"thread1");
18 // 4、调用线程对象的start()方法启动线程
19 thread1.start();
20 // 创建并启动另一个线程thread2
21 Thread thread2 = new Thread(myThread2,"thread2");
22 thread2.start();
23 }
24 }
运行结果如图1所示。
图1 运行结果
文件1中,定义了一个实现Runnable接口的实现类MyThread2,并重写了run()方法,然后在main()方法中先后创建并启动了两个线程实例。在main()方法中创建线程实例时,先创建了Runnable接口的实现类对象myThread2,然后将myThread2作为Thread构造方法的参数来创建线程实例,最后同样通过start()方法启动了线程实例。
从图1可以看出,两个线程对象同样交互执行了各自重写的run()方法,并打印出对应的输出信息,这就说明案例通过实现Runnable接口的方式实现了多线程。
小提示:
Runnable接口中只有一个抽象的run()方法,那么该接口就属于JDK 8中定义的函数式接口,在使用时,可以直接通过Lambda表达式的方式更简洁的来实现线程实例。同样,在下一小节将要讲解的Callable接口也属于函数式接口。