0%

16.2.2 实现Runnable接口创建线程类

16.2.2 实现Runnable接口创建线程类

实现Runnable接口来创建并启动多线程的步骤如下。
①定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
创建Runnable实现类的实例,并以此实例作为Threadtarget来创建Thread对象,该Thread对象才是真正的线程对象。也可以在创建Thread对象时为该Thread对象指定一个名字
③调用线程对象的start()方法来启动该线程。

下面程序示范了通过实现Runnable接口来创建并启动多线程。

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
// 通过实现Runnable接口来创建线程类
public class SecondThread implements Runnable
{
private int i ;
// run方法同样是线程执行体
public void run()
{
for ( ; i < 100 ; i++ )
{
// 当线程类实现Runnable接口时,
// 如果想获取当前线程,只能用Thread.currentThread()方法。
System.out.println(Thread.currentThread().getName()
+ " " + i);
}
}

public static void main(String[] args)
{
for (int i = 0; i < 100; i++)
{
System.out.println(Thread.currentThread().getName()
+ " " + i);
if (i == 20)
{
SecondThread st = new SecondThread(); // ①
// 通过new Thread(target , name)方法创建新线程
new Thread(st , "新线程1").start();
new Thread(st , "新线程2").start();
}
}
}
}

上面程序中实现了run()方法,也就是定义了该线程的线程执行体。

如何获取当前线程对象

  • 通过继承Thread类来获得当前线程对象比较简单,直接使用this关键字就可以了;
  • 但通过实现Runnable接口来获得当前线程对象,则必须使用Thread.currentThread()方法。

Runnable接口是函数式接口

Runnable接口中只包含一个抽象方法,从Java 8开始, Runnable接口使用了@FunctionalInterface修饰。也就是说, Runnable接口是函数式接口,可使用Lambda表达式创建Runnable对象。接下来介绍的Callable接口也是函数式接口。

多个线程共享一个target则可以共享target中的实例变量

采用Runnable接口的方式创建的多个线程可以共享线程类的实例变量。这是因为只创建了一个target实例,而多个线程可以共享这个target实例,因而多个线程中的实例变量也是共享的。

原文链接: 16.2.2 实现Runnable接口创建线程类