Java线程创建的四种方式

1. 概述

在Java中,线程是一种轻量级的执行单元,用于并发执行任务。创建线程的方式有多种,包括继承Thread类、实现Runnable接口、实现Callable接口以及使用线程池。本文将介绍这四种方式的使用方法和代码示例,并解释每个步骤的含义。

2. 创建线程的步骤

下表展示了创建线程的四种方式的具体步骤:

方式 步骤
继承Thread类 1. 定义一个继承自Thread类的子类<br>2. 重写子类的run()方法
实现Runnable接口 1. 定义一个实现了Runnable接口的类<br>2. 实现接口中的run()方法
实现Callable接口 1. 定义一个实现了Callable接口的类<br>2. 实现接口中的call()方法
使用线程池 1. 创建一个线程池对象<br>2. 提交任务给线程池执行

3. 继承Thread类

首先,我们来看如何通过继承Thread类来创建线程。

// 1. 定义一个继承自Thread类的子类
public class MyThread extends Thread {
    // 2. 重写子类的run()方法
    @Override
    public void run() {
        // 线程执行的代码逻辑
    }
}

在继承Thread类的子类中,我们需要重写run()方法,并在该方法中编写线程需要执行的逻辑代码。线程的执行逻辑应该在run()方法中实现。

4. 实现Runnable接口

接下来,我们介绍如何通过实现Runnable接口来创建线程。

// 1. 定义一个实现了Runnable接口的类
public class MyRunnable implements Runnable {
    // 2. 实现接口中的run()方法
    @Override
    public void run() {
        // 线程执行的代码逻辑
    }
}

实现Runnable接口的类需要实现其唯一的run()方法,并在该方法中编写线程需要执行的逻辑代码。

5. 实现Callable接口

除了使用Runnable接口,我们还可以通过实现Callable接口来创建线程。Callable接口可以返回一个结果,并且可以在任务执行过程中抛出异常。

import java.util.concurrent.Callable;

// 1. 定义一个实现了Callable接口的类
public class MyCallable implements Callable<Integer> {
    // 2. 实现接口中的call()方法
    @Override
    public Integer call() throws Exception {
        // 线程执行的代码逻辑
        return 42; // 返回一个结果
    }
}

实现Callable接口的类需要实现其唯一的call()方法,并在该方法中编写线程需要执行的逻辑代码。call()方法可以返回一个结果,这里以返回整数42为例。

6. 使用线程池

最后,我们介绍如何使用线程池来创建线程。线程池是一种管理和复用线程的机制,可以提高线程的执行效率和资源的利用率。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        // 1. 创建一个线程池对象
        ExecutorService executor = Executors.newFixedThreadPool(5);
        
        // 2. 提交任务给线程池执行
        executor.execute(new Runnable() {
            @Override
            public void run() {
                // 线程执行的代码逻辑
            }
        });
        
        // 3. 关闭线程池
        executor.shutdown();
    }
}

我们通过Executors类的静态方法newFixedThreadPool()创建一个固定大小的线程池对象。然后,我们使用execute()方法向线程池提交一个实现Runnable接口的任务,任务会在一个空闲的线程上执行。最后,我们通过shutdown()方法关闭线程池。

7. 状态图

下面是线程的生命周期状态图:

stateDiagram
    [*] --> 新建
    新建 --> 就绪