Java多线程创建详解:Thread与Runnable

0 下载量 111 浏览量 更新于2024-09-01 收藏 636KB PDF 举报
"这篇教程详细介绍了Java中的线程创建,包括线程的生命周期状态和两种主要的创建方式。线程的生命周期涉及新建、就绪和运行三个阶段。创建线程通常通过继承Thread类或实现Runnable接口来实现。在新建状态,线程通过构造方法初始化。当调用start()方法时,线程进入就绪状态,等待CPU分配资源执行。start()方法内部会调用native方法start0(),最终执行run()方法,标志着线程开始运行。此外,文章还区分了调用start()和run()的区别,start()会启动新线程,而run()仅作为线程内业务逻辑的入口,在主线程中直接调用run()不会创建新线程。" 在Java中,多线程编程是并发执行任务的关键。线程的创建涉及几个关键步骤和概念。首先,线程有三种基本状态:新建(New)、就绪(Runnable)和运行(Running)。当使用`new`关键字创建一个Thread对象时,线程处于新建状态。有两种主要的线程创建方式: 1. **继承Thread类**:创建一个类继承自Thread,然后重写它的run()方法。例如: ```java public class MyThread extends Thread { public MyThread(String name) { super(name); } @Override public void run() { // 业务逻辑 } } MyThread myThread = new MyThread("Thread1"); ``` 2. **实现Runnable接口**:创建一个实现了Runnable接口的类,并实现run()方法。然后将Runnable实例传递给Thread构造函数: ```java public class MyRunnable implements Runnable { @Override public void run() { // 业务逻辑 } } MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable, "Thread1"); ``` 在创建线程后,调用`start()`方法将线程置为就绪状态,等待操作系统调度执行。`start()`方法内部会调用本地(native)方法`start0()`,这是一个与操作系统交互的接口,它会启动一个新的线程并执行`run()`方法。需要注意的是,`run()`方法并不会自动运行,除非通过`start()`启动。 调用`run()`方法与`start()`方法有着本质区别。直接调用`run()`方法相当于调用一个普通方法,业务逻辑会在当前线程(通常是主线程)中执行,不会创建新的线程。而`start()`则会创建一个新的线程,使得`run()`方法在新的线程上下文中执行,实现并发。 这两种方式各有优缺点。继承Thread类的方式直接继承了Thread类的功能,但限制了类的继承性,因为Java不支持多重继承。而实现Runnable接口则保留了类的多重继承能力,但需要额外的Thread对象来封装Runnable实例。 在实际开发中,通常推荐使用实现Runnable接口的方式,因为它更符合面向接口编程的原则,也更利于代码的维护和扩展。同时,可以利用线程池(如ExecutorService)来管理线程,提高系统的效率和资源利用率。