一、进程和线程的简介

进程的概念

  1. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
  2. 进程中所包含的一个或多个执行单元成为线程。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。
  3. 线程智能属于一个进程并且它智能访问该进程所拥有的资源。当操作系统创建一个进程后,该进程会被申请一个名为主线程或首要线程的线程。

线程的概念:

  • 一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行的堆栈。线程在切换时负荷小。因此,线程成为轻负荷进程。一个进程中可以有多个线程。

进程和线程的区别:

  1. 地址空间:进程的各个线程,它们共享进程的地址空间,而进程有自己独立的地址空间。
  2. 执行速度:线程的切换速度要比进程快的多。
  3. 相互依赖上:进程是资源分配和拥有的单位,同一个进程内的线程共享进程资源。
  4. 线程是处理器调度的基本单位,但进程不是。
  5. 二者皆可并发执行。

线程的适用场合:

  • 适用于一个程序中需要多个任务同时执行,此时可以借助多线程来完成这个任务。

二、线程的状态:

线程的六大状态简介:

  1. NEW:线程刚创建
  2. RUNNABLE:在JVM中正在运行的线程
  3. BLOCKED:线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
  4. WAITING:等待状态
  5. TIMED_WAITING:调用sleep() join() wait()方法可能导致线程处于等待状态
  6. TERMINATED:线程执行完毕,已经退出

线程的六大状态图:

线程的六大状态转换过程详解:

  1. 当线程继承Thread或者实现了Runnable创建了线程对象后,当new线程对象过后线程就进入了初始的状态。
  2. 当线程对象调用了start()方法的时候,线程启动进入可运行的状态。
  3. 线程进入可运行状态后,如果逻辑完成那么线程将会终结,如果没有执行完毕中间JVM分配时间片用完,将进入可运行状态,一旦线程被JVM选中则立即执行。
  4. 运行状态的情况比较复杂
    1. 第一:线程如果执行run() main()方法结束后,完成逻辑,线程就进入Terminated
    2. 第二:当线程调用sleep()或者join()方法就会进入Blocked状态,但是要注意的是阻塞的线程是不释放当前所占有的系统资源,当sleep()结束或者join()等待其他线程来到,当前线程则进入Runnable状态等待JVM分配资源。
    3. 第三:当线程进入Runnable状态,但是还没有开始运行的时候,此时发现需要的资源处于同步状态synchronized,这个时候线程将会进入Timed_ waiting状态,JVM会使用队列对这些线程进行控制,既先进行Time waiting的线程会先得到JVM资源进行执行进入Waiting
    4. 第四:如果处于Runnable的线程调用yield()让出JVM资源,那么就会进入New状态和其他New状态线程进行竞争重新进入Runnable
    5. 第五:如果当前线程调用wait()方法,则当前线程进入Timed_waiting但是这个时候当前线程会释放所占有的JVM资源,进入这个状态过后是不能自动唤醒的,必须调用notify()或者notifyAll()方法,线程进入Waiting。

线程的创建和API

创建线程的几种方式

三、线程的常用方法讲解及API

获取当前的线程:Thread.currentThread

1)获取运行当前代码片段的线程

代码实例:

2)获取当前现成的其它线程信息,方法如下:

  1. getId:返回该线程的标识符
  2. getName:返回该线程的名称
  3. getPriority:返回线程优先级
  4. getState:获取当前线程状态
  5. isAlive:测试线程是否处于活动状态
  6. isDaemon:线程是否为守护线程
  7. isInterrupted:是否已经中断

代码实例:

线程优先级:

更改线程优先级的方法:setPriority(int priority)

线程的切换是由线程调度控制的,无法通过代码来干涉,但是可以通过提高线程优先级来最大程度改善线程获取时间片的几率。优先级分为10级,值为1-10,1最低,10最高。

线程优先级的三个常量:

  1. Thread.MIN_PRIORITY
  2. Thread.MAX_PRIORITY
  3. Thread.NORM_PRIORITY

代码实例:

守护线程:

设置线程为守护线程的方法:setDaemon(boolean)

Java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(true)设置为守护线程。如果不设置次此属性,默认为用户线程。

用户线程和守护线程的区别:

  1. 主线程结束后用户线程还会继续运行,在没有用户线程可服务时会自动离开;
  2. 守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。

代码实例:

休眠方法:

Static void sleep(long ms)

该方法会使当前线程进入阻塞状态指定毫秒,当阻塞指定毫秒后,当前线程会重新进入Runnable状态,等待划分时间片。

代码实例:

yeild、join方法

1)yeild方法:

static void yield()

用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。

2)join方法:

void join()

用于等待当前线程结束,才会让其它线程执行。

调用时需要捕获InterruptException

join方法的代码实例:


我的微信公众号:架构真经(关注领取免费资源)

参考文章

  1. https://jingyan.baidu.com/article/6b97984dfec1481ca2b0bf14.html

操作系统(3)-线程的六大状态、基于代码实战的线程创建及六个常用方法相关推荐

  1. 连傻瓜都能看懂的基于代码注入的线程守护技术

    连傻瓜都能看懂的基于代码注入的线程守护技术 2010年08月31日 连傻瓜都能看懂的基于代码注入的线程守护技术 Author: 叶紫孤(CPP肥兔) (感谢冷风大哥提供技术支持) E-mail: ye ...

  2. java代码批量下载_Java代码实战:线程池实现批量下载文件

    今天技术之家陪你一起Java代码实战:线程池实现批量下载文件: 1 创建线程池package com.cheng.webb.thread; import java.util.concurrent.Ar ...

  3. 线程分离属性,线程取消(状态,类型),线程取消例程函数

    目录 1.线程分离属性 2.线程取消(状态,类型) 3.线程取消例程函数 1.线程分离属性 默认情况下,线程启动后处于可接合状态(即未分离),此时的线程可以在退出时让其他线程接合以便释放资源,但若其他 ...

  4. java字符流的父类_Java基于代码实战的字符流父类、字符转换流、缓冲字符流、过滤流...

    1. Java输入输出(I/O)流的知识回顾: 补充:因为这篇文章是基于上一篇的延续,因此将上一篇进行简单的回顾,以便理解本节内容. 1)输入输出(I/O)流分类:共分为字节型输入输出流和字符型输入输 ...

  5. 实现多线程、进程、线程、设置和获取线程名称、线程调度、线程控制、线程生命周期、同步代码块、线程安全的类、Lock锁、生产者消费者模式

    实现多线程:

  6. JAVA线程六种状态_Java:线程的六种状态及转化

    多线程概述及创建方式 Java:线程的六种状态及转化 关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结: java.lang.Thread.State枚举类中定义了六种线程的状态,可以调 ...

  7. 线程定义, 实现方式及代码实现.

    多任务(Multitasking) 操作系统将CPU时间动态地划分给每个进程,操作系统同时执行多个进程,每 个进程独立运行.以进程的观点来看,它会以为自己独占Cpu的使用权. 线程是操作系统能够进行运 ...

  8. 多线程--线程的六种状态

    在多线程中,线程在不同的情况下会有不同的状态,了解线程的状态可以帮助我们更好的掌握多线程. 线程状态简介 在JDK8中,Thread一共有六种状态,它们被定义在一个枚举里,我们根据源码来大概看一下不同 ...

  9. APUE 线程的分离状态

    在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反, ...

最新文章

  1. 推理计算过程_转导推理—Transductive Learning
  2. IIS 7启用static JSON文件能POST方法
  3. 创意组竞赛正式文档中修正内容
  4. 网络营销外包——网络营销外包专员如何提升首页关键词的转化率
  5. 由于问题引起信号ORA-27154无法启动数据库
  6. android项目中刷新activity界面
  7. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解
  8. 《深入浅出数据分析》第九章——R语言
  9. ktm390蓝牙连接安卓_蓝牙音乐AudioTrack Session ID的获取
  10. 计算机单招六百分好考吗,单招分数线一般多少 单招考过的几率有多少
  11. Matlab多个Figure图合成一个Fig
  12. java设计模式观察者模式_java设计模式--观察者模式
  13. 学习Linux第一天
  14. 开源维护者,必有一战!
  15. python小甲鱼笔记_小甲鱼python笔记第4讲笔记(个人笔记)
  16. c语言实现自动编译器,实现简易的C语言编译器(part 1)
  17. Protel 99 SE 应用技术问答
  18. 怎么把音乐WAV格式转换为MP3格式
  19. labelme为圆环状物体打标签【tips】
  20. 自然常数e的由来(简单通俗易于理解自然常数e)

热门文章

  1. java生成实体类的工具内部是如何实现的(mysql)
  2. 服务器变量:$_SERVER
  3. Oracle 9i 返回一个记录集的方法
  4. 1024 许个愿吧,万一实现了呢?
  5. 利用Kubernetes名称空间来管理内存和CPU资源(三)
  6. drools的可升级读写锁探究
  7. Netty 的 ByteBuf 是如何支持 堆内存非池化 实现的
  8. 工程师软技能6:理财人生精神
  9. 从源码分析RocketMQ系列-Producer的SendResult来自哪里?
  10. java 画笔跟swing组件_「软帝学院」:2019思维最清晰的java学习路线