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 工具包)的基础。
