Java多线程复习:线程创建与调度

需积分: 0 0 下载量 198 浏览量 更新于2024-08-05 收藏 362KB PDF 举报
"E05_多线程复习.pdf 是一份关于Java多线程的复习资料,涵盖了进程、线程的基本概念,线程的创建方式,线程调度,以及线程安全和JUC编程的相关知识点。" 在计算机系统中,**进程**是一个正在执行的应用程序,它拥有独立的内存空间,包含代码、数据和资源。而**线程**则是进程中的执行单元,是CPU调度的基本单位。在同一个进程中,可以存在多个线程,它们共享进程的资源,各自执行不同的任务,这样的进程称为**多线程程序**。 Java中线程的调度主要采用的是**抢占式调度**,即线程的执行并非按照固定的顺序,而是由操作系统根据优先级和调度策略决定。线程的执行权可能在任何时候被其他高优先级的线程抢占。 创建线程主要有两种方式: 1. **继承Thread类**: - 定义子类继承Thread类。 - 重写run()方法,定义线程任务。 - 创建子类对象并调用start()方法启动线程。 2. **实现Runnable接口**: - 定义类实现Runnable接口。 - 重写run()方法,定义线程任务。 - 创建Thread类对象,将Runnable对象作为参数传递给Thread构造器。 - 调用Thread对象的start()方法启动线程。 继承Thread类可以直接使用Thread类的方法,如start(),但限制了类的单继承性。而实现Runnable接口则可以避免这一限制,同时实现多态和资源的解耦合。 **sleep()** 和 **wait()** 都是用于控制线程的暂停,但它们属于不同的类和用途: - **sleep()** 是Thread类的静态方法,让当前线程暂停指定时间,然后自动恢复执行,无论是否持有锁。在同步代码块中使用sleep()不会释放锁。 - **wait()** 是Object类的方法,用于线程间通信,让线程在指定对象的监视器上等待,直到被其他线程唤醒或超时。wait()必须在同步环境中(如synchronized块或方法)使用,并且会释放锁。 **join()** 方法允许一个线程等待另一个线程完成其执行,确保线程的执行顺序。 **线程安全问题**通常出现在多个线程访问同一共享资源时,如果没有适当的同步机制,可能会导致数据不一致。通过**同步机制**(如synchronized关键字、Lock接口等)可以保证线程安全。 线程有五种基本状态:**新建**(New)、**就绪**(Runnable)、**运行**(Running)、**阻塞**(Blocked)和**终止**(Terminated)。 Java并发编程中的**JUC**(Java Util Concurrency)提供了丰富的工具类,具备以下三大特性: 1. **原子性**(Atomicity):保证操作不可分割,要么全部完成,要么都不做。 2. **可见性**(Visibility):确保一个线程对共享变量的修改能被其他线程立即看到。 3. **有序性**(Ordering):控制线程的执行顺序,防止指令重排序。 理解这些概念和原理对于编写高效、稳定的多线程程序至关重要。在实际编程中,应根据具体需求灵活运用各种线程控制机制,以实现最佳的并发性能。