多语言展示
当前在线:245今日阅读:167今日分享:16

JAVA入门之如何实现多线程程序开发

我们在前面 JAVA入门 相关的经验中涉及的程序都是单线程的 (整个程序只有一条执行线索),单线程程序是计算机单核时代主流的开发模式,但随着多核技术的发展,多线程程序的优势越来越明显,其运行效率和用户体验都远超单线程程序!JAVA 对多线程开发有着很棒的支持,这篇经验就告诉大家如何通过 JAVA 来进行多线程开发!
工具/原料

Eclipse

方法/步骤
1

什么是线程线程是指程序的一条执行线索,单线程程序是指整个程序只有一条执行线索,该程序在一个特定时间点上,只能执行一个任务;多线程程序是指整个程序有两条或者两条以上执行线索,在一个特定时间点上,其能执行两件或者两件以上的任务(注意这个还需多核心计算机来配合)!截图显示了同一种业务逻辑(包含四个任务),分别通过单线程和多线程来执行这段业务的流程图!从图上可以看出,多线程程序能充分发挥电脑多核心的优势!

2

认识 Runnable 接口java.lang.Runnable 接口代表一个线程任务!我们启动的每一个线程都是针对一个具体任务,即这个线程去做什么!比如上个步骤截图中 '接受用户输入' 这个线程任务就可以通过 Runnable 接口来描述! 我们创建自己的任务,就是创建一个实现 Runnable 接口的类 : /** * 用于接受用户输入的任务 */public class ImportUserInputTask implements Runnable { /** * 我们实现 Runnable 就是要覆写其中的 run 方法 * 我们启动的线程执行的所有逻辑都在这个方法中定义 */ @Override public void run() {    // Thread.currentThread() 返回的就是执行这个代码的那个线程实例    System.out.println(Thread.currentThread().getName() +                         ' 开始执行自己的业务逻辑了!');    try {        // Thread 类的静态方法 sleep, 代表让执行这个代码的那个线程实例暂停多少毫秒        // 我们通过这种方式来体现一段耗时的业务操作        Thread.sleep(1000); // 1000 ms    } catch (InterruptedException e) {        e.printStackTrace();    }    // 当执行完下面最后一段代码后,这个线程就结束了!    System.out.println(Thread.currentThread().getName() +                        ' 执行完毕自己的业务逻辑!');    }}

3

认识 Thread 类java.lang.Thread 这个类就是 JAVA 中的线程类!我们创建一个 Thread 对象,就代表我们创建了一条线程 : Thread firstThread = new Thread('第一个线程');但目前这个线程只有一个名称,没有指定任何执行逻辑,我们刚刚认识了 Runnable 接口,Thread 类有这样一个构造函数 : Thread firstThread = new Thread(Runnable target, String name);这个构造函数的第一个参数就是一个 Runnable 接口类型的对象,通过这个构造函数,我们就能为我们的线程指定其执行逻辑了 : /** * 创建一个线程,其第一个参数指定这个线程要执行的代码逻辑! * 第二个参数指定线程的名称,我们可以通过这个名称来跟踪线程的执行轨迹。 */ Thread firstThread = new Thread(new ImportUserInputTask(), '第一个线程'); /** * 创建完线程后,线程不会自动运行!需要调用 Thread 的 start 方法, * 这样这个线程就处于'就绪'状态,等待CPU调度程序为其分配执行资源, * 所有资源都分配完成后,进入运行状态,线程开始执行 Runnable 接口中指定的代码逻辑! */ firstThread.start();

4

实现第一个多线程程序 我们这段代码中,主线程启动后,分别创建名称为 '第一个线程' 和 '第二个线程' 的两个线程,并启动两个线程执行他们各自对应的代码逻辑! 主线程接着执行自己的代码逻辑,结束 : public class MultipleThreadExample { /*** 一个JAVA程序启动后,就是启动了一个线程,这个线程被称为 '主线程',* 其执行的代码逻辑就是如下的 main 方法,因为我们总是说,main 方法* 是 JAVA 程序执行的入口!**/ public static void main(String[] args) {     System.out.println('主线程开始执行!');     System.out.println('主线程开始启动第一个线程!');     /**     * 创建一个线程,其第一个参数指定这个线程要执行的代码逻辑!     * 第二个参数指定线程的名称,    * 我们可以通过这个名称来跟踪线程的执行轨迹。     */     Thread firstThread = new Thread(new ImportUserInputTask(),                                                  '第一个线程');     /**     * 创建完线程后,线程不会自动运行!需要调用 Thread 的 start 方法,     * 这样这个线程就处于'就绪'状态,等待CPU调度程序为其分配执行资源,     * 所有资源都分配完成后,进入运行状态,    * 线程开始执行 Runnable 接口中    指定的代码逻辑!     */     firstThread.start();     System.out.println('主线程启动的第一个线程开始运行!');     System.out.println('主线程开始启动第二个线程!');     Thread secondThread = new Thread(new ImportUserInputTask(),                                                       '第二个线程');     secondThread.start();     System.out.println('主线程启动的第二个线程开始运行!');     System.out.println('主线程开始执行自己的业务逻辑!');     try {        // 这里就是让主线程实例暂停 2000 毫秒        Thread.sleep(2000);     } catch (InterruptedException e) {         e.printStackTrace();     }     System.out.println('主线程执行完毕!');     }}

5

运行结果 : 主线程开始执行!主线程开始启动第一个线程!主线程启动的第一个线程开始运行!主线程开始启动第二个线程!第一个线程 开始执行自己的业务逻辑了!主线程启动的第二个线程开始运行!主线程开始执行自己的业务逻辑!第二个线程 开始执行自己的业务逻辑了!第一个线程 执行完毕自己的业务逻辑!第二个线程 执行完毕自己的业务逻辑!主线程执行完毕!

6

总结 : 多线程开始是以后程序开发的标准模式,在整体的业务处理流程中,任何一块耗时(或易阻塞)的操作都可以启动一个单独的线程来处理!这样可以大大增强程序的运行效率和用户体验!

注意事项
1

线程执行的代码逻辑通过实现Runnable接口的类来定义

2

Thread创建的新线程不会直接运行,比如调用其 start 方法,让其先进入就绪状态,再准备运行

推荐信息