1.线程的概念

              线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。

2.1线程的状态,java线程在运行中的生命周期中可能会处于6种不同的状态。

  1.  New(new)新创建状态。线程被创建,还没有调用start方法之前,在线程运行之前还要初始化一些基础工作要做。
  2. Runnable(runnable)可运行状态。线程一旦调用start方法,线程就处于Runnable状态,一个可运行的线程可能是正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。
  3. Blocked(blocked)阻塞状态。表示该线程被锁阻塞,它暂时不活动。
  4. Waiting(waiting)等待状态。线程暂时不活动,并且不运行任何代码,这消耗最少的资源,直到线程调度器重新激活它。
  5. Timed waiting:超时等待状态。和等待状态不不同的是,它是可以在指定的时间自行返回。
  6. Terminated:终止状态。表示当前线程竟已经执行完毕,导致线程终止两种情况,第一种就是run方法执行完毕正常退出,第二种就是一个没有捕获的异常而终止了run方法,导致线程进入终止状态。

2.2线程运行状态(这个张图必须的会画)

线程创建后,调用 Thread 的 start 方法,开始进入运行状态,当线程执行wait 方法后,线程进入等待状态,进入等待状态的线程需要其他线程通知才能返回运行状态。超时等待相当于在等待状 态加上了时间限制,如果超过时间限制,则线程返回运行状态。当线程调用到同步方法时,如果线程没有获得锁则进入阻塞状态,当阻塞状态的线程获取到锁时则重新回到运行状态。当线程执行完毕或者遇到意外异常终止时,都会进入终止状态。

3.线程中断(理解中断)

当线程的run方法执行完毕,或者在方法中出现没有捕获的异常时,线程将终止,在java早期版本中有一个stop()方法,其他的线程可以调用它终止线程,但是这个方法现在已经被弃用了。interrupt方法可以用来请求中断线程,当一个线程调用interrupt方法时,线程的中断标识位将被置位(中断标识位为true),线程将会不时地检测这个中断标识位,以判断线程是否应该被中断,。要想知道线程是否被置位,可以调用Thread.currentThread().isInterrupted(),   如下所示:

while(!Thread,currentThread().isInterrupted()){//todo 代码逻辑
}

还可以调用Thread.interrupted()来对中断标识位进行复位。但是如果一个线程被阻塞,就无法检测中断状态,如果一个线程处于阻塞状态,线程在检查中断标识位时如果发现中断标识位为true,则会在阻塞方 法调用处抛出InterruptedException异常,并且在抛出异常前将线程的中断标识位复位,即重新设置为 false。 需要注意的是被中断的线程不一定会终止,中断线程是为了引起线程的注意,被中断的线程可以决定如何 去响应中断。如果是比较重要的线程则不会理会中断,而大部分情况则是线程会将中断作为一个终止的请 求。另外,不要在底层代码里捕获InterruptedException异常后不做处理,如下所示:

如果你不知道抛出InterruptedException异常后如何处理,这里介绍两种合理的处理方式。         (1)在catch子句中,调用Thread.currentThread.interrupt()来设置中断状态(因为抛出异常后中断标 识位会复位),让外界通过判断Thread.currentThread().isInterrupted()来决定是否终止线程还是继续下 去,应该这样做:

         (2)更好的做法就是,不使用try来捕获这样的异常,让方法直接抛出,这样调用者可以捕获这个异 常,如下所示:

4.安全地终止线程

前面我们讲到了中断,那么首先就用中断来终止线程,代码如下:

在上面代码注释1处调用了sleep方法使得main线程睡眠10ms,这是为了留给MoonThread线程时间来感 知中断从而结束。除了中断,还可以采用boolean变量来控制是否需要停止线程,代码如下:

在上面代码注释1处用到了volatile关键字,volatile在这里我们只需要知道因为 涉及多个线程对这个变量的访问,所以当我们在设置volatile boolean on的时候,当有其他线程改变其值时, 所有的线程都会感知到它的变化。这两种方式输出的结果类似,如图所示。这里只打出了部分信息,i的 值由1一直打印到1390(输出的结果是变化的)。最后打印stop,说明执行到了run方法的末尾,线程即将终 止。

java线程(线程的概念,线程的状态)相关推荐

  1. 线程阻塞的概念 (Java 中的睡眠状态sleep 等待状态wait 礼让状态yield 自闭状态join suspend() 和 resume() )

    线程阻塞的概念: 线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发. 参考文章1:什么是线程阻塞?为什么会出现线程阻塞? 参考文章2:线程阻塞

  2. java进程与线程_Java多线程笔记(零):进程、线程与通用概念

    前言 不积跬步,无以至千里:不积小流,无以成江海.在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程.线程以及相关的基础概念. 进程 通常,我们把一个程序的执行称为一个进程.反过来 ...

  3. Java多线程笔记(零):进程、线程与通用概念

    前言 不积跬步,无以至千里:不积小流,无以成江海.在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程.线程以及相关的基础概念. 进程 通常,我们把一个程序的执行称为一个进程.反过来 ...

  4. Java线程之核心概念

    2019独角兽企业重金招聘Python工程师标准>>> 1.线程的三个基本角色 线程是一个执行流程,它不是类,也不是对象.我们先来梳理一下线程的三个基本角色: Runnable接口: ...

  5. Java线程详解(4)-线程状态的转换

    一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可以分为五大状态.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行, ...

  6. java线程的基本概念

    进程和线程 进程的诞生 操作系统中有2个任务A,B,任务A先执行,执行到一半需要io,因此要大量时间,在这个时间段内cpu是空闲的,浪费了资源,于是就有进程,当A暂时无法利用cpu,但是又不能销毁时, ...

  7. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  8. Java并发编程(02):线程核心机制,基础概念扩展

    本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...

  9. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  10. java并发编程第一课 线程的创建、停止和状态变更

    开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...

最新文章

  1. spring Transaction Propagation 事务传播
  2. 【教学课件】IT教学课件和课程考试资料汇总
  3. aop注解配置切点 spring_springboot aop 自定义注解方式实现一套完善的日志记录
  4. java 生产者消费者代码_Java生产者和消费者代码
  5. ios 添加导航栏视图_iOS进度栏(进度视图)
  6. Could not find an NgModule. Use the skip-import option to skip importing in NgModule.
  7. Hadoop2.0安装
  8. project各版本网盘免费下载
  9. Linux配置java环境变量
  10. java用php退出清除session_PHP学习笔记:删除与销毁session
  11. VS2008安装错误,解决方案
  12. Python教程:在Python中遍历列表详解
  13. 如何找到最新的RFC文档
  14. iSCSI网络SCSI接口
  15. 剑指offe面试题19——正则表达式匹配
  16. 4.4 Kali与windows xp之间搭建TFTP服务
  17. Plupload和错误生成
  18. 前端Number转千位符以及反转
  19. 878. 第 N 个神奇数字 数学+二分
  20. Django计算机毕业设计JAVA高校田径运动会管理(程序+LW)Python

热门文章

  1. 文字排版中的字号尺寸对照表(清晰、准确(含两个版本对比)、可复制)
  2. 不卡顿成用户购机第一要素,Mate 9深得人心
  3. css设置div垂直居中
  4. 全国计算机一级考试试题题库---附答案
  5. Wei Yang Bryan Lim, etc. Federated Learning in Mobile Edge Networks: A Comprehensive Survey.
  6. CSS 巧妙实现文字二次加粗再加边框
  7. 台湾-李宏毅教授的深度学习视频教程
  8. 华擎计算机主板配置,DDR+478+PCIEx16当下最平民化的计算机配置
  9. keil4和烧录软件的基本使用
  10. Origin8画图:将多个worksheet表画在同一张图