定义线程的两种方式

创建和使用线程,就是要让这个线程完成一些特定的功能。 Java 提供了 java.lang.Thread 类来完成多线程的编程,这个类也提供了大量的方法方便操作线程。在编写一个线程类时,可以继承自这个 Thread 类,完成线程的相关工作。

有时编写的线程类除了继承 Thread 以外还要继承其他类,但 Java 又不支持多继承,所以 Java 还提供了另外一种创建线程的方式,即实现 Runnable 接口。

因此,有两种定义线程类的方式——继承 Thread 类和实现 Runnable 接口。

如果线程类直接继承 Thread 类,其代码结构大致如下:

class 类名 extends Thread{
    //属性
    //其他方法
    public void run() { // 重写 `Thread` 类中的 run() 方法
        //线程需要执行的核心代码
    }
}

从线程类的代码结构可以看出,一个线程的核心代码需要写在 run() 方法里。也就是说,当线程从就绪状态,通过调度程序分配 CPU 资源,进入运行状态后,执行的代码即 run() 方法里面的代码。

如果线程类是实现 Runnable 接口的,其代码结构大致如下:

class 类名 implements Runnable{
    //属性
    //其他方法
    public void run() { // 实现Runnable接口中的 run() 方法
        //线程需要执行的核心代码
    }
}

和继承 Thread 类非常类似,实现 Runnable 接口的线程类也需要编写 run() 方法,将线程的核心代码置于该方法中。但是 Runnable 接口中仅仅定义了 run() 这么一个方法(Thread类中可以接收Runnable对象)因此还必须将 Runnable 对象转换为 Thread 对象,从而使用 Thread 类中的线程 API ,转换的方法如下所示。

Runnable 实现类名 对象名 = new  Runnable实现类名();
Thread 线程对象名 = new Thread(对象名);
上一篇:Java中Runnable和Thread的区别(网上部分说法是错误的)


下一篇:JDK1.8线程池 ThreadPoolExecutor详解