Runnable接口

创建线程方式二

通过API我们可以得知创建线程的方式总共有两种,一种是继承Thread类方式,一种是实现Runnable接口方式

采用java.lang.Runnable创建线程是非常常见的一种方式,我们只需要重写run方法即可

步骤如下:

  1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
  2. 创建Runnable实现类的实例,并且以此实例作为Thread的Target来创建Thread对象,该Thread的对象才是真正的线程对象。
  3. 调用线程对象的start()方法来启动线程。
1
2
3
4
5
6
7
8
9
public class MyRunnable implements Runnable {

@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
}
  • public interface **Runnable**

Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。

设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。激活的意思是说某个线程已启动并且尚未停止。

此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。

  • 从以下版本开始:

    JDK1.0

实现Runnable接口创建多线程好处

  1. 避免了单继承的局限性

    一个类只能继承一个类,类继承了Thread类就不能继承其它的类

    实现了Runnable接口,还可以继承其它的类,实现其它的接口

  2. 增强了程序的扩展性,降低了程序的耦合性(解耦)

    实现Runnable接口的方式,把设置线程任务和开启线程进行了分离(解耦)

    实现类中,重写了run方法:用来设置线程任务

    创建Thread类对象,调用start方法:用来开启新线程

匿名内部类实现线程的创建

匿名内部类作用: 简化代码

​ 把子类继承父类,重写父类方法,创建子类对象合成一步完成

​ 把实现类接口,重写接口中的方法,创建实现类对象合成一步完成

匿名内部类的最终产物:子类/实现类对象,而这个类没有名字

格式:

​ new 父类/接口(){

​ 重写父类/接口中的方法

​ };

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Main {
public static void main(String[] args) {

// 匿名内部类是Thread的子类
new Thread(){
@Override
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
}.start();

// 匿名内部类是Runnable的实现类
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
};
new Thread(r).start();

// 匿名内部类是Runnable的实现类; 匿名对象调用
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
}).start();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Thread-0 0
Thread-2 0
Thread-1 0
Thread-2 1
Thread-0 1
Thread-2 2
Thread-1 1
Thread-2 3
Thread-0 2
Thread-2 4
Thread-1 2
Thread-2 5
Thread-0 3
Thread-2 6
Thread-1 3
Thread-2 7
Thread-0 4
Thread-2 8
Thread-1 4
Thread-2 9
Thread-0 5
Thread-1 5
Thread-0 6
Thread-1 6
Thread-0 7
Thread-1 7
Thread-0 8
Thread-1 8
Thread-0 9
Thread-1 9

Runnable接口
https://blog.wangxk.cc/2020/08/30/Runnable接口/
作者
Mike
发布于
2020年8月30日
许可协议