Java多线程编程:并发执行与Thread类解析

需积分: 9 2 下载量 6 浏览量 更新于2024-08-01 收藏 61KB DOCX 举报
"Java 多线程编程是利用并发机制执行多个指令流,每个指令流称为线程。线程在逻辑上并发执行,共享进程的存储空间,简化了线程间通信。Java 提供了 Thread 类来支持多线程编程,通过覆盖 Thread 类的 run() 方法来指定线程要执行的代码。可以继承 Thread 类并重写 run() 来创建自定义线程。" 在 Java 中实现多线程主要依赖于两个核心概念:线程的创建和线程的执行控制。 1. **线程创建** - **继承 Thread 类**:创建一个类继承自 `Thread` 类,并重写 `run()` 方法,将需要执行的代码放入 `run()` 中。然后实例化这个子类对象,并调用 `start()` 方法启动线程。例如: ```java public class MyThread extends Thread { int count = 1, number; public MyThread(int num) { number = num; System.out.println("创建线程" + number); } @Override public void run() { while (true) { System.out.println("线程" + number + ": 计数" + count); if (++count == 6) return; } } public static void main(String[] args) { new MyThread(1).start(); } } ``` - **实现 Runnable 接口**:创建一个实现了 `Runnable` 接口的类,重写 `run()` 方法。然后将该类的实例传递给 `Thread` 类的构造函数,创建 `Thread` 对象并启动。这种方式更利于代码的复用和多态。 2. **线程执行控制** - `start()` 方法:启动线程,调用 `run()` 方法。注意,直接调用 `run()` 并不会启动新线程,而是在当前线程中执行 `run()` 的代码。 - `join()` 方法:等待当前线程执行完成再继续执行其他线程。 - `sleep(long milliseconds)`:使当前线程暂停指定毫秒数,释放 CPU 资源。 - `yield()`:让当前线程暂停,但不阻塞,让其他线程有机会运行。 - `interrupt()` 和 `isInterrupted()`:中断线程和检测线程是否被中断。 3. **线程同步与协作** - **同步方法(synchronized)**:使用 synchronized 关键字修饰方法或代码块,确保同一时间只有一个线程能访问特定的代码。 - **锁(Lock)**:Java 提供了 `java.util.concurrent.locks.Lock` 接口及其实现,如 ReentrantLock,提供了比 synchronized 更细粒度的锁控制。 - **volatile**:关键字 volatile 可以确保共享变量的可见性和有序性,避免线程之间的数据不一致。 - **条件变量(Condition)**:配合 Lock 使用,用于线程间通信和协调。 - **死锁(Deadlock)**:当两个或更多线程互相等待对方释放资源,造成无法继续执行的情况。应避免死锁,例如避免嵌套锁和循环等待。 4. **线程优先级** - Java 线程有 10 个优先级,`Thread.MIN_PRIORITY`(1)到 `Thread.MAX_PRIORITY`(10),默认优先级是 `Thread.NORM_PRIORITY`(5)。优先级高的线程可能获得更多的 CPU 时间片,但这并不保证执行顺序。 5. **线程池(ExecutorService 和 ThreadPoolExecutor)** - Java 5 引入了 `java.util.concurrent.ExecutorService` 和 `java.util.concurrent.ThreadPoolExecutor`,通过线程池管理线程,提高性能和资源利用率。 理解这些基础知识后,可以编写出高效、安全的多线程程序,应对并发处理的需求。在实际开发中,还需要考虑异常处理、资源管理以及性能优化等复杂问题。