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

Java线程

线程相关概念

程序

        是为完成特定任务、用某种语言编写的一组指令的集合。简单的来说:就是我们写的代码

进程

        进程是指运行中的程序。比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。每当启动一个新的进程时,操作系统都会为之分配新的内存空间。

        进程时程序的一次执行过程,或是正在运行的一个程序。是动态过程:有自身的产生、存在和消亡的过程。

线程

        线程由进程创建,是进程的一个实体。一个进程可以有多个线程

单线程

        同一时刻,只允许执行一个线程

多线程

        同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件。

并发

        同一时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单来说,单核cpu实现的多任务就是并发

并行

        同一时刻多个任务同时执行。多核cpu可以实现并行

并行与并发可以同时存在的 

创建线程的四种方式

  1. 继承Thread类,重写run方法

  2. 实现Runnable接口,重写run方法

  3. 实现Callnable接口,重写run方法

  4. 线程池

线程启动调用start的原因

        1.使用start调用start方法
        

public synchronized void start(){
    start0();
}

                

        2.start0()是本地(native)方法,是JVM调用,底层是C/C++实现,真正实现多线程的效果是start0(),而不是run

        

public native void start0();

线程终止 

        当线程完成任务后,回自动退出

        还可以通过使用变量来控制run方法退出的方式停止线程,既通知方式。

线程常用方法

  1. setName                                设置线程名称,使之与参数name相同
  2. getName                                返回线程的名称
  3. start                                        是线程开始执行;Java虚拟机底层调用该线程的start0方法
  4. run                                          调用线程对象run方法
  5. setPriority                               更改线程的优先级
  6. getPriority                               获取线程的优先级
  7. sleep                                      再指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
  8. interrupt                                  中断线程(并灭有真正的结束线程,一般用于中断正在休眠的线程。比如线程sleep20S,使用interrupt会使线程提前执行)
  9. yield                                        线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定成功
  10. join                                          线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程的所有的任务     

yield                与cpu内核有关系,当cpu内核处理游刃有余的时候并不会发生礼让

join                  一旦插队成功知道执行完插队的线程后才会执行原来的线程。例如有两个线

                        程 A,B。线程A的方法里面join线程B那么会在线程A会在join线程B的时候礼

                        让线程B执行完毕后重新执行线程A未执行完的东西

相关文章:

  • 【Flink读写外部系统】Flink自定义kafka分区并输出
  • 【云原生】学习K8s的扩展技能(CRD)
  • Chapter05 修炼python基本功:条件语句和循环
  • 彻底掌握Makeifle(三)
  • 手机抓取蓝牙日志btsnoop的方法汇总(Android一直补充中)
  • 【Vue 开发实战】实战篇 # 30:实现一个可动态改变的页面布局
  • [单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)
  • 【iVX 开发 - 入门】开发环境、应用对象树介绍(含操作演示)
  • CTFshow 代码审计
  • 19-Django REST framework-DRF工程搭建
  • CSP-S信息学奥赛考试大纲(提高级)
  • 电源硬件设计----降压-升压(Buck-Boost)变换器基础
  • C语言循环的嵌套、比较、break语句,continue语句
  • 【数据挖掘算法与应用】——数据挖掘导论
  • Java语言高级特性——泛型
  • js写一个简单的选项卡
  • mysql 5.6 原生Online DDL解析
  • PHP面试之三:MySQL数据库
  • Redis在Web项目中的应用与实践
  • TypeScript迭代器
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue自定义指令实现v-tap插件
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 微信开放平台全网发布【失败】的几点排查方法
  • 新版博客前端前瞻
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 异步
  • 在weex里面使用chart图表
  • 正则学习笔记
  • 智能合约Solidity教程-事件和日志(一)
  • 《天龙八部3D》Unity技术方案揭秘
  • 带你开发类似Pokemon Go的AR游戏
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (09)Hive——CTE 公共表达式
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (第27天)Oracle 数据泵转换分区表
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (接口封装)
  • (力扣)循环队列的实现与详解(C语言)
  • (转)http-server应用
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core使用ef 6
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /usr/bin/env: node: No such file or directory
  • :如何用SQL脚本保存存储过程返回的结果集
  • [ C++ ] STL---stack与queue