线程的基本概念
- 在Java中,线程(Thread)是并发编程的基本单元。线程允许一个程序执行多个任务(代码路径),从而提高效率和响应性。下面是对Java线程的详细介绍,包括概念、实现方法、线程的生命周期、常见的线程管理工具和最佳实践等。
1. 线程的基本概念
- 进程与线程:
- 进程是操作系统中执行的一个程序实例,拥有独立的内存空间。
- 线程是进程中的一个执行单元,一个进程可以包含多个线程,这些线程共享进程的内存空间和资源。
- 多线程的意义:
- 并发:多线程可以让程序执行多个任务,提高应用程序的性能,尤其是在I/O密集型任务中,如文件读取、网络请求等。
- 并行:在多核处理器上,多个线程可以同时在不同的CPU核心上运行,实现真正的并行处理。
2. 创建线程的两种方式
2.1 继承Thread类
通过继承Thread类并重写run()方法来定义线程,然后调用start()方法启动线程。
示例代码:
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread is running.");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程,run()方法将被执行
}
}
2.2 实现Runnable接口
通过实现Runnable接口的run()方法,然后将其传递给Thread对象并调用start()方法启动线程。这种方式更为灵活,因为它允许类继承其他类,同时实现多线程。
示例代码:
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable is running.");
}
}
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动线程,run()方法将被执行
}
}
3. 线程的生命周期
Java中的线程在运行时经历不同的状态,每个状态都有特定的意义和作用。
- 新建状态(New):线程对象被创建,但还未启动。
- 就绪状态(Runnable):线程已经启动,等待CPU分配时间片执行。
- 运行状态(Running):线程获得CPU时间片,正在执行run()方法中的代码。
- 阻塞状态(Blocked/Waiting/Timed Waiting):线程因某种原因被阻塞,等待某个条件的满足(如等- 待锁释放、计时器到期等)。
- 终止状态(Terminated):线程的run()方法执行完毕或因未捕获的异常而终止。
4. 线程的常见操作
4.1 线程休眠(sleep())
Thread.sleep(milliseconds)方法使当前线程暂停执行一段时间,但不释放锁。
示例代码:
public class Main {
public static void main(String[] args) {
try {
System.out.println("Thread sleeping...");
Thread.sleep(2000); // 线程休眠2秒
System.out.println("Thread woke up.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4.2 线程等待(join())
join()方法在Java中用于线程间的协调和等待。它使一个线程等待另一个线程完成执行后才继续执行
示例代码:
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread is running: " + i)