Java多线程编程实战:start()与run()解析

3星 · 超过75%的资源 需积分: 9 3 下载量 72 浏览量 更新于2024-09-16 1 收藏 61KB DOC 举报
"Java 多线程实例与线程对象的方法" 在Java编程中,多线程是一项核心技能,尤其对于处理并发任务和优化程序性能至关重要。本实例旨在通过具体的代码示例,帮助读者理解Java多线程的实现方式及其差异。 首先,我们来看两种创建线程的方式: 1. **继承Thread类**: 在给出的实例中,`MyThread` 类继承自 `Thread` 类,并重写了 `run` 方法。当创建 `MyThread` 的实例并调用 `start()` 方法时,JVM会启动一个新的线程来执行 `run` 方法。在这个例子中,创建了10个 `MyThread` 对象,每个对象的 `run` 方法内部只是简单的递增变量 `x` 并打印,因此,由于线程的并发执行,最终输出10次1,而不是按顺序打印1到10。 2. **实现Runnable接口**: 另一种方式是创建一个实现了 `Runnable` 接口的类,如 `R` 类。在这种情况下,你需要将 `Runnable` 实例传递给 `Thread` 构造函数。同样,我们创建10个线程,但这次它们共享同一个 `R` 实例。由于 `run` 方法内的 `x` 是类级别的变量,所有线程都会访问和修改同一个变量,因此,这10个线程按顺序打印出1到10。 线程对象的几个重要方法: - **start()**:这是启动线程的关键方法。调用 `start()` 不会立即执行 `run` 方法,而是将 `run` 方法放入线程的执行队列中,等待JVM调度执行。这意味着线程的执行顺序是由JVM决定的,而不是程序员控制的。 - **run()**:正如前面所述,`run` 方法是你定义线程执行逻辑的地方。它不是立即执行的,只有当 `start()` 被调用并且线程被JVM调度后,`run` 才会被执行。 除了 `start()` 和 `run()`,线程对象还有其他重要的方法,如: - **join()**:让当前线程等待指定线程(通常是在调用 `join()` 的线程)完成执行后再继续执行。 - **sleep()**:使当前线程暂停执行指定的时间,进入可中断的等待状态。 - **isAlive()**:检查线程是否仍然处于活动状态。 - **interrupt()**:中断线程。如果线程正在执行 `sleep()`, `wait()` 或 `join()`,则会抛出 `InterruptedException`。 - **yield()**:让当前线程放弃CPU资源,让其他线程有机会执行,但不保证一定切换到其他线程。 这些方法在编写多线程程序时,能帮助你更好地控制和同步线程。理解和熟练运用这些方法,对于编写高效、稳定的并发程序至关重要。在实际应用中,还需要考虑线程安全、死锁、竞态条件等并发问题,以及Java提供的并发工具类,如 `synchronized`, `volatile`, `java.util.concurrent` 包中的类等,以确保多线程程序的正确性和性能。