跳至主要內容

Java线程基础


Java 在多线程编程方面提供了丰富的支持,使得并发编程相对容易和直观。在 Java 中,线程可以通过以下两种主要方式实现:

1. 继承 Thread

Java 提供了一个内建的类 java.lang.Thread,用户可以通过继承这个类并重写其 run() 方法来创建一个新的线程。以下是一个基本示例:

public class HelloThread extends Thread {
    public void run() {
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        HelloThread t = new HelloThread();
        t.start();  // 启动线程
    }
}

在这个例子中,start() 方法被调用时,Java 虚拟机(JVM) 会在单独的调用栈中调用 run() 方法。这意味着 run() 方法的执行是异步的。

2. 实现 Runnable 接口

另一个创建线程的方式是实现 Runnable 接口。这种方式比继承 Thread 类更灵活,因为它允许你继续继承另一个类,同时也可以将线程的执行任务与 Thread 类的实现分离开。

public class HelloRunnable implements Runnable {
    public void run() {
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new HelloRunnable());
        thread.start();
    }
}

在这个示例中,HelloRunnable 类实现了 Runnable 接口的 run() 方法,并且通过一个 Thread 对象来启动线程。

线程的生命周期

Java 线程的生命周期包括以下几个阶段:

  • 新建(New):创建后尚未启动的线程。
  • 就绪(Runnable):线程已启动并准备运行,等待 CPU 调度。
  • 运行(Running):线程正在 JVM 中运行。
  • 阻塞(Blocked):线程被阻塞,无法继续执行,通常是因为正在等待 I/O、资源锁等。
  • 等待(Waiting):线程进入等待状态,等待其他线程执行特定操作(如通知或中断)。
  • 超时等待(Timed Waiting):类似于等待状态,但有最大时间限制。
  • 终止(Terminated):线程的 run() 方法执行完毕或因异常退出运行。

线程的方法

以下是一些常用的 Thread 类方法:

  • start():启动线程,使其进入就绪状态。
  • run():定义线程执行的操作。
  • join():等待调用此方法的线程结束。
  • sleep(long millis):使当前运行的线程暂停指定的时间(以毫秒为单位)。
  • interrupt():中断线程。
  • setPriority(int newPriority):改变线程的优先级。
  • setName(String name):设置线程的名称,有助于调试。

同步和锁

为了管理多个线程访问共享资源的情况,Java 提供了几种同步机制:

  • 同步方法:在方法签名前加上 synchronized 关键字,确保一次只有一个线程可以进入该方法。
  • 同步块:指定一个对象,一次只有一个线程可以执行该代码块。
  • volatile 关键字:确保变量的改变立即可见于其他线程,防止指令重排序。

这些是 Java 多线程编程的基础知识。掌握这些概念是理解更高级的并发控制技术和框架(如 java.util.concurrent 工具包)的基础。

上次编辑于: