Java并发编程基础-线程简介
章节目录
- 1.线程定义
- 2.使用多线程的优势
- 3.线程优先级
- 4.线程的状态
- 5.Daemon 线程
1.线程定义
进程与线程的区别
1.进程是cpu进行资源分配的独立单位,指的是程序在数据集合上的一次运行过程。 2.线程是cpu 进行调度的最小单位,在一个进程中会创建多个线程。
线程拥有的独立资源
栈中数据是线程独享的,包括局部变量、程序计数器等 堆中数据是线程共享的,如线程同时操作堆中某对象的某属性。
Java程序运行的实质
一个程序的运行不仅仅是main()方法的运行,而是main线程和多个其他线程共同运行
2.使用多线程的优势
1.充分利用更多的处理核心
2.更快的响应时间
例如,一笔订单的创建,它包括插入订单数据,生成订单快照,发送邮件通 知买家和记录货品销售数量等, 用户从单击“订购按钮" 开始,就要等待这些操 作全部完成才能看到订购成功的结果,但是这么多的业务操作,如何才能够跟快的完成? 在上面的场景中,我们可以使用多线程技术,即将数据一致性不强的操作派发 给其他线程处理,好处是响应用户请求的线程能更快的处理完成,缩短了响应时间,提升了用户体验。
3.线程优先级
thread.setPriority(10),线程优先级从1-10顺序排列
4.线程的状态
Java线程在运行的声明周期中可能处于如下表所示的6中状态,在给定的一个时刻,线程只能处于其中一个状态。
状态名称 | 说明 |
---|---|
new | 初始状态,线程被构建,但是还没有调用start()方法 |
runnable | 运行状态,Java线程将操作系统中的就绪与运行两种状态统称为"运行中" |
block | 阻塞状态,表示线程等待资源可用,如i/o 或者阻塞于锁 |
waiting | 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断) |
time_waiting | 超时等待状态,该状态不同于waiting,它是可以在指定的时间自行返回的 |
terminated | 终止状态,表示当前线程执行完毕 |
如下图所示,为java线程状态变迁图:
1.线程创建之后,调用start()方法,状态变更为可运行状态,待资源准备就绪后,开始运行。
2.线程执行 lockObject.wait() 方法,线程进入等待状态。
3.进入等待状态的线程依靠其他线程的通知才能返回到运行状态。
4.超时等待相当于在等待状态基础上增加超时限制,超时时间到达会自动返回到运行状态。
5.线程调用同步方法,在没有获取锁的情况下,线程会进入到阻塞状态。
6.线程在执行Runable 的run()方法后,进入终止状态。
Daemon线程
支持性线程,被用作程序中后台调度以及支持性工作。
当一个Java虚拟机中不存在非Daemon线程时,JVM将退出。
可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。
Daemon属性需要在启动线程前执行,不能在启动线程之后启动。
注意:Daemon线程被用作完成支持性工作,但在Java虚拟机退出时,Daemon线程中的finally不一定会执行。
如下代码所示:
public class Daemon { static class DaemonRunner implements Runnable { public void run(){ try{ TimeUnit.Second.sleep(10);//沉睡10s }finally{ System.out.println("Daemon thread finally run");//执行类似资源回收动作 } } } }
当JVM中已经没有非Daemon线程,虚拟机就要退出。JVM中所有Daemon线程需要立即终止,因此finally块并没有执行。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
杨老师课堂_Java核心技术下之控制台模拟微博用户注册案例
案例设计背景介绍: 编写一个新浪微博用户注册的程序,要求使用HashSet集合实现。 假设当用户输入用户名、密码、确认密码、生日(输入格式yyyy-mm-dd为正确)、手机号码(手机长度为11位,并且以13、15、17、或18开头的手机号为正确)、 邮箱(包含符号“@”为正确)信息之后,判断信息是否输入正确, 正确校验用户是否重复注册,如果不是重复注册,则注册成功。 案例效果预览图: 注册成功: 注册失败: 失败1: 失败2: 失败3: 案例设计代码: 本案例共设计到3个类,用户实体类、用户注册类、用户信息校验类。 用户注册类: package cn.javabs.setdemo; import java.util.HashSet; import java.util.Scanner; /** * Date:2018-05-14 * @author Mryang * * *思路分析: 1.为了便于存储用户信息,需要创建一个用户类,在类中重写其中的HashCode()方法, 其返回用户名的哈希值,再重写equals()方法,来比较对象的用户名属性是否相等。 2.有了用户类之后,...
- 下一篇
Ubuntu apt-get和pip国内源更换
Ubuntu apt-get和pip源更换 更新数据源为国内,是为了加速安装包的增加速度。 更换apt-get数据源 输入:sudo -s切换为root超级管理员; 执行命令:vim /etc/apt/sources.list; 使用命令:%d 清空所有内容; 清华数据源地址:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 选择相应的版本复制内容,点击“i”键进入编辑文本模式,粘贴内容到vim编辑窗体,点击“ESC”键进入编辑模式,输入“:wq”保存离开; 更新源:sudo apt-get update 更新软件:sudo apt-get upgrade pip3的安装与升级 安装pip3:sudo apt-get install python3-pip 升级pip3:sudo pip3 install --upgrade pip 查看pip版本:pip -V pip源更换 根目录创建.pip文件:mkdir ~/.pip 创建文件pip.conf:vim .pip/pip.conf 点击“i”键,进入编辑模式,复制信息: [glob...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长