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