Osheep

时光不回头,当下最重要。

Java 中的线程创建的方式(二)

导语:

上篇文章中介绍了线程创建的第一种方法,本文主要介绍线程的第二种创建方式,并通过实例带大家理解线程创建的另外一种方法。

线程的创建,启动方式二

线程创建的第二种方法是实现 Runnable 接口
先上代码:

1 public class TestThread001 implements Runnable{//创建了一个普通的类TestThread001,实现Runnable接口,具备争抢资源的能力,即多线程的能力。
2    //实现接口后,就要重写里面的抽象方法 run,run 方法里面的内容就是线程体
3    @Override
4    public void run() {
5        for (int i = 1; i <=10; i++) {
6            System.out.println(i);
7        }    
8    }
9 }
10 public class Test {
11    public static void main(String[] args) {
12        TestThread001 tt=new TestThread001();//创建了一个线程对象。        
13        //tt.start();
14        Thread t=new Thread(tt);
15        t.setName("线程Test--");
16        t.start();
17        for (int i = 1; i <=10; i++) {
18            System.out.println(Thread.currentThread().getName()+i);
19        }
20    }
21 }

现在就来解释一下这段代码:

第 1 至 9 行代码只是表示创建了一个普通的类 TestThread001,然后该类实现了 Runnable 接口,具备了多线程的能力。和第一种方法类似,实现了 Runnable 接口之后也需要重写 run 方法。

第 12 行表示创建了一个线程对象 tt,但此时它只是一个普通的对象而已。此时,如果再执行 tt.start() 语句,你就会发现 tt 根本没有 start() 方法。但是,启动一个线程又必须调用它的 start() 方法。怎么办?

首先我们要知道的是, start() 方法是属于 Thread 类的,所以需要根据 Thread 类创建一个对象 t,调用这个对象的 start() 方法把 tt 线程启动起来。那这个 Thread 对象怎么才能和线程对象联系起来呢?答案就是通过构造器,所以就有了第 14 行代码(我应该表达清楚了吧)。然后第 15 行给线程起名字,第 16 行,调用 t 的 start() 方法启动线程 tt。

这段代码就是线程创建并启动的第二种标准方法,应该不难理解。

这段代码的运行结果如下:

《Java 中的线程创建的方式(二)》

运行结果

这段代码也表明这两个线程在微观上是交替运行的。

那么这两种创建线程的方式哪种好呢?
答案是第二种方法好,即实现 Runnable 方法更好。因为在Java中只能单继承,一个类继承了 Thread 类之后就不能再继承其他的类了,而一个类却可以多实现,实现不同的接口,所以第二种方法比第一种更好。

点赞