当前位置: 首页 > news >正文

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

第1章

Java多线程技能

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

线程的启动;

如何使线程暂停;

如何使线程停止;

线程的优先级;

线程安全相关的问题。

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

1.1 进程和多线程概述

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

e67444ee09244b4a7999c99822331806.png

图1-1 进程的定义

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

e5de5cfd9a56c914f3eed7027b53c531.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所示。

d692b94c47d6acd708138489841963f7.png

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

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

b2ca9fc90bb910750b8bc9ec2dfd38dd.png

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

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

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

fee583e023e17f62481b5c4b51432577.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所示。

bb02d456d928c5fb1319ff35b6539edb.png

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

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

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

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

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

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

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

相关文章:

  • 看java源码怎么学_3个阅读跟踪Java源码的小技巧,很实用!
  • java的类方法_【Java】类方法和实例方法
  • java 废弃注解_Java 注解
  • java从菜鸟_Java从菜鸟到精通(5) | 学步园
  • python数据格式_python数据类型
  • 下载mysql然后怎么安装_mysql 下载与安装
  • java 方法前加同步_Java同步的三种实现方式详解
  • mysql 事务的作用_使用Mysql事务的优点
  • java和android架构公众号_Android仿微信公众号界面
  • 连连看的连线怎么写java_求助 这个连连看的方法地方该怎么写
  • php java字节流_php中stream(流)的用法
  • java自动雨刷系统_【图文】汽车自动雨刷的使用指南
  • php 多线程处理_PHP CURL 多线程操作代码实例
  • php定义函数打印表格内容,php 自定义函数实现将数据 以excel 表格形式导出示例...
  • nodejs与php混合,php与nodejs的加密数据互通
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • crontab执行失败的多种原因
  • CSS 提示工具(Tooltip)
  • iOS 颜色设置看我就够了
  • Java,console输出实时的转向GUI textbox
  • JDK 6和JDK 7中的substring()方法
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Nodejs和JavaWeb协助开发
  • php ci框架整合银盛支付
  • Protobuf3语言指南
  • Python进阶细节
  • SQLServer插入数据
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 计算机在识别图像时“看到”了什么?
  • 前端性能优化--懒加载和预加载
  • 实战|智能家居行业移动应用性能分析
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信公众号开发小记——5.python微信红包
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • # 达梦数据库知识点
  • $$$$GB2312-80区位编码表$$$$
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (论文阅读40-45)图像描述1
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Core 项目指定SDK版本
  • @SentinelResource详解
  • [ C++ ] STL---仿函数与priority_queue
  • []error LNK2001: unresolved external symbol _m
  • []常用AT命令解释()
  • [<MySQL优化总结>]
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [AIGC] Java 和 Kotlin 的区别
  • [Android]常见的数据传递方式
  • [BUUCTF]-Reverse:reverse3解析