Java多线程编程:通过Thread类与Runnable接口创建线程

需积分: 8 1 下载量 26 浏览量 更新于2024-08-18 收藏 6.8MB PPT 举报
"这篇文档主要介绍了Java中的多线程编程,包括线程的概念、创建、状态、同步与死锁、线程间通信以及Executor服务。文章提到了两种创建自定义线程的方式,一种是继承Thread类,另一种是实现Runnable接口,并对比了两者之间的差异。此外,还讲解了线程的状态转换以及相关的线程控制方法。" 在Java编程中,多线程是并发处理任务的关键技术,允许程序同时执行多个独立的代码段。线程是程序执行的最小单元,它共享同一进程的资源,因此比进程更加轻量级,能够提高系统资源利用率。 **线程创建** 1. **继承Thread类**:创建一个新的类,直接继承自Thread类,然后重写它的`run()`方法。创建线程实例后,调用`start()`方法启动线程。这种方式使得类只能继承Thread,无法再继承其他类,限制了多态性。 ```java class MyThread extends Thread { public void run() { // 执行逻辑 } } MyThread thread = new MyThread(); thread.start(); ``` 2. **实现Runnable接口**:创建一个实现了Runnable接口的类,实现`run()`方法。然后将Runnable对象作为参数传递给Thread类的构造器,创建Thread实例并启动。这样类可以继承其他类,保持了多态性。 ```java class MyRunnable implements Runnable { public void run() { // 执行逻辑 } } Thread thread = new Thread(new MyRunnable()); thread.start(); ``` **线程状态** 线程有六种基本状态:新建、可运行、运行、阻塞、死亡。这些状态可以通过`start()`、`sleep()`、`wait()`、`join()`、`interrupt()`等方法进行转换。 - **新建**:线程被创建但尚未启动。 - **可运行**:线程启动,准备由操作系统调度执行。 - **运行**:线程正在CPU上执行。 - **阻塞**:线程被暂停,可能是因为等待I/O操作、锁或其他资源。 - **死亡**:线程执行完毕或被强制中止。 **线程控制** - `start()`:启动线程,使其进入可运行状态。 - `stop()`:已废弃,不推荐使用,因为它可能导致资源泄露和不安全状态。 - `suspend()`:暂停线程,但不释放锁,易导致死锁。 - `resume()`:恢复已暂停的线程执行。 - `destroy()`:已废弃,不推荐使用。 - `interrupt()`:中断线程,通常用于退出循环或处理中断异常。 **结束线程** - **非持续性循环**:通过修改循环条件让线程自然结束。 - **停止方法**:`stop()`方法已废弃,不安全,不推荐使用。 - **中断**:通过`interrupt()`方法通知线程中断,线程应检查中断标志并适当响应,如抛出`InterruptedException`。 **线程同步与死锁** 线程同步是解决多个线程访问共享资源时可能出现的数据不一致问题,Java提供了`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`等机制。死锁是指两个或更多线程相互等待对方释放资源,从而导致它们都无法继续执行的情况。 **线程间通信** Java提供了`wait()`, `notify()`, `notifyAll()`方法进行线程间的通信,以及`BlockingQueue`等高级API实现线程间的协作。 **Executor服务** Java 5引入了Executor框架,它简化了线程池的创建和管理,可以更好地控制线程的并发行为,如`ThreadPoolExecutor`和`Executors`工具类。 理解并熟练掌握Java中的多线程编程对于开发高效的并发应用程序至关重要,这包括正确创建和管理线程,避免竞态条件和死锁,以及有效地利用线程同步和通信机制。