Java多线程编程:Thread与Runnable实现

需积分: 0 0 下载量 163 浏览量 更新于2024-08-03 收藏 67KB MD 举报
"高级.md - 多线程编程" 在计算机科学中,多线程是一种允许应用程序同时执行多个任务的技术。通过多线程,程序可以在同一时间段内执行多个不同的线程,从而提高系统的并发性和效率。这种技术尤其在处理CPU密集型和I/O密集型任务时非常有用,因为它能更好地利用处理器资源。 ## 1、多线程 多线程的实现基于操作系统对CPU时间片的分配机制。操作系统会将CPU的时间划分为多个小的时间片,每个线程在分配到时间片时可以执行其任务,然后切换到下一个线程。由于这些切换速度非常快,用户感觉像是所有线程都在同时运行。 ### 1.1、Java中的多线程编程 在Java中,有两种主要的多线程实现方式: #### 1.1.1、Thread实现 - **自定义线程类继承Thread类**:创建一个新的类,继承自`java.lang.Thread`,然后重写`run()`方法。`run()`方法包含线程要执行的代码。启动线程时,不直接调用`run()`,而是调用`start()`方法。这是因为`start()`会触发线程的执行,而`run()`只是普通的方法调用,不会产生新的线程。 ```java public class D1 extends Thread { @Override public void run() { // 线程体 } public static void main(String[] args) { D1 d1 = new D1(); d1.start(); // 启动线程 } } ``` #### 1.1.2、基于Runnable接口实现 - **实现Runnable接口**:如果一个类已经继承了其他类,无法再直接继承Thread,可以选择实现Runnable接口。这时,需要提供一个实现了`run()`方法的Runnable对象,并将其传递给Thread的构造器。同样,启动线程也需要通过Thread的`start()`方法。 ```java public class ThreadDemo { public static void main(String[] args) { for (int i = 0; i < 3; i++) { String title = "线程对象" + i; new Thread(() -> { // lambda表达式实现Runnable }).start(); } } } ``` ### 1.2、线程状态与控制 Java中的线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。线程可以通过`sleep()`, `join()`, `yield()`, `synchronized`关键字等方式进行控制和同步。 ### 1.3、线程安全问题 多线程环境下,数据共享可能导致数据不一致的问题,如竞态条件和死锁。Java提供了多种机制来解决这些问题,包括`synchronized`关键字用于同步代码块或方法,`volatile`关键字确保变量对所有线程可见,以及`java.util.concurrent`包下的各种并发工具类。 ### 1.4、线程优先级 Java允许为线程设置优先级,但实际的调度仍然取决于操作系统。优先级较高的线程可能会获得更多的执行机会,但并不能保证绝对的执行顺序。 ### 1.5、线程中断与异常处理 `interrupt()`方法可以用来中断线程,而`isInterrupted()`和`interrupted()`方法可以检查线程是否被中断。线程应该定期检查中断标志,并适当地响应中断请求。 ### 1.6、线程池 为了更有效地管理线程,Java提供了ExecutorService和ThreadPoolExecutor,它们允许创建线程池,可以控制线程的创建和销毁,提高性能并避免资源过度消耗。 总结,多线程编程是Java开发中的重要技能,它涉及到线程的创建、控制、同步和通信等多个方面,理解和掌握这些概念对于编写高效、健壮的并发程序至关重要。