《Java多线程编程核心技术(第2版)》 —1 Java多线程技能

举报
华章计算机 发表于 2020/02/08 13:07:57 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.1节,作者是高洪岩。

 

第1章

Java多线程技能

作为本书的第1章,重点是让读者快速进入Java多线程的学习,所以本章主要介绍Thread类的核心方法。Thread类的核心方法较多,读者应该着重掌握如下技术点:

线程的启动;

如何使线程暂停;

如何使线程停止;

线程的优先级;

线程安全相关的问题。

以上内容也是本章学习的重点与思路,掌握这些内容是进入Java多线程学习的必经之路。

1.1 进程和多线程概述

本书主要介绍在Java语言中使用的多线程技术,但讲到多线程技术时不得不提及“进程”这个概念,“百度百科”对“进程”的解释如图1-1所示。

 image.png

图1-1 进程的定义

初看这段文字十分抽象,难以理解,那么再来看如图1-2所示的内容。

 image.png

图1-2 Windows 7系统中的进程列表

难道一个正在操作系统中运行的exe程序可以理解成一个“进程”?没错!

通过查看“Windows任务管理器”窗口中的列表,完全可以将运行在内存中的exe文件理解成进程—进程是受操作系统管理的基本运行单元。

程序是指令序列,这些指令可以让CPU完成指定的任务。*.java程序经编译后形成*.class文件,在Windows中启动一个JVM虚拟机相当于创建了一个进程,在虚拟机中加载class文件并运行,在class文件中通过执行创建新线程的代码来执行具体的任务。创建测试用的代码如下:

public class Test1 {

    public static void main(String[] args) {

        try {

            Thread.sleep(Integer.MAX_VALUE);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

在没有运行这个类之前,任务管理器中以“j”开头的进程列表如图1-3所示。

 image.png

图1-3 任务管理器中以“j”开头的进程

Test1类重复运行3次后的进程列表如图1-4所示。可以看到,在任务管理器中创建了3个javaw.exe进程,说明每执行一次main()方法就创建一个进程,其本质上就是JVM虚拟机进程。

 image.png

图1-4 创建了3个javaw.exe进程

那什么是线程呢?线程可以理解为在进程中独立运行的子任务,例如,QQ.exe运行时,很多的子任务也在同时运行,如好友视频线程、下载文件线程、传输数据线程、发送表情线程等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等这些功能都有对应的线程在后台默默地运行。

进程负责向操作系统申请资源。在一个进程中,多个线程可以共享进程中相同的内存或文件资源。

image.png

使用多线程有什么优点呢?其实如果有使用“多任务操作系统”的经验,如Windows系列,大家应该都有这样的体会:使用多任务操作系统Windows,可以大幅利用CPU的空闲时间来处理其他任务,例如,可以一边让操作系统处理正在用打印机打印的数据,一边使用Word编辑文档。CPU在这些任务中不停地进行切换,由于切换的速度非常快,给使用者的感受是这些任务在同时运行,所以使用多线程技术可以在同一时间内执行更多不同的任务。

为了更加有效地理解多线程的优势,下面先来看如图1-5所示的单任务运行环境。

在图1-5中,任务1和任务2是两个完全独立、不相关的任务。任务1在等待远程服务器返回数据,以便进行后期处理,这时CPU一直呈等待状态,一直在“空运行”。任务2在10s之后被运行,虽然执行完任务2所用时间非常短,仅仅是1s,但也必须等任务1运行结束后才可以运行任务2,本程序运行在单任务环境中,所以任务2有非常长的等待时间,系统运行效率大幅降低。单任务的特点就是排队执行,即同步,就像在cmd中输入一条命令后,必须等待这条命令执行完才可以执行下一条命令。在同一时间只能执行一个任务,CPU利用率大幅降低,这就是单任务运行环境的缺点。

多任务运行环境如图1-6所示。

image.png

在图1-6中,CPU完全可以在任务1和任务2之间来回切换,使任务2不必等到10s之后再运行,系统和CPU的运行效率大大提升,这就是为什么要使用多线程技术、为什么要学习多线程。多任务的特点是在同一时间可以执行多个任务,这也是多线程技术的优点。使用多线程也就是在使用异步。

在通常情况下,单任务和多任务的实现与操作系统有关。例如,在一台计算机上使用同一个CPU,安装DOS磁盘操作系统只能实现单任务运行环境,而安装Windows操作系统则可以实现多任务运行环境。

在什么场景下使用多线程技术?笔者总结了两点。

1)阻塞。一旦系统中出现了阻塞现象,则可以根据实际情况来使用多线程技术提高运行效率。

2)依赖。业务分为两个执行过程,分别是A和B。当A业务发生阻塞情况时,B业务的执行不依赖A业务的执行结果,这时可以使用多线程技术来提高运行效率;如果B业务的执行依赖A业务的执行结果,则可以不使用多线程技术,按顺序进行业务的执行。

在实际的开发应用中,不要为了使用多线程而使用多线程,要根据实际场景决定。

多线程是异步的,所以千万不要把Eclipse代码的顺序当作线程执行的顺序,线程被调用的时机是随机的。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。