java线程(线程的概念,线程的状态)
1.线程的概念
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
2.1线程的状态,java线程在运行中的生命周期中可能会处于6种不同的状态。
- New(new)新创建状态。线程被创建,还没有调用start方法之前,在线程运行之前还要初始化一些基础工作要做。
- Runnable(runnable)可运行状态。线程一旦调用start方法,线程就处于Runnable状态,一个可运行的线程可能是正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。
- Blocked(blocked)阻塞状态。表示该线程被锁阻塞,它暂时不活动。
- Waiting(waiting)等待状态。线程暂时不活动,并且不运行任何代码,这消耗最少的资源,直到线程调度器重新激活它。
- Timed waiting:超时等待状态。和等待状态不不同的是,它是可以在指定的时间自行返回。
- 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线程(线程的概念,线程的状态)相关推荐
- 线程阻塞的概念 (Java 中的睡眠状态sleep 等待状态wait 礼让状态yield 自闭状态join suspend() 和 resume() )
线程阻塞的概念: 线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发. 参考文章1:什么是线程阻塞?为什么会出现线程阻塞? 参考文章2:线程阻塞
- java进程与线程_Java多线程笔记(零):进程、线程与通用概念
前言 不积跬步,无以至千里:不积小流,无以成江海.在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程.线程以及相关的基础概念. 进程 通常,我们把一个程序的执行称为一个进程.反过来 ...
- Java多线程笔记(零):进程、线程与通用概念
前言 不积跬步,无以至千里:不积小流,无以成江海.在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程.线程以及相关的基础概念. 进程 通常,我们把一个程序的执行称为一个进程.反过来 ...
- Java线程之核心概念
2019独角兽企业重金招聘Python工程师标准>>> 1.线程的三个基本角色 线程是一个执行流程,它不是类,也不是对象.我们先来梳理一下线程的三个基本角色: Runnable接口: ...
- Java线程详解(4)-线程状态的转换
一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可以分为五大状态.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行, ...
- java线程的基本概念
进程和线程 进程的诞生 操作系统中有2个任务A,B,任务A先执行,执行到一半需要io,因此要大量时间,在这个时间段内cpu是空闲的,浪费了资源,于是就有进程,当A暂时无法利用cpu,但是又不能销毁时, ...
- Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作
在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...
- Java并发编程(02):线程核心机制,基础概念扩展
本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...
- Java并发编程(01):线程的创建方式,状态周期管理
本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...
- java并发编程第一课 线程的创建、停止和状态变更
开篇词: 由点及面,搭建你的 Java 并发知识网 你好,欢迎学习<Java 并发编程核心 78 讲>,我是讲师星星,一线互联网公司资深研发工程师,参与过集团内多个重点项目的设计与开发. ...
最新文章
- spring Transaction Propagation 事务传播
- 【教学课件】IT教学课件和课程考试资料汇总
- aop注解配置切点 spring_springboot aop 自定义注解方式实现一套完善的日志记录
- java 生产者消费者代码_Java生产者和消费者代码
- ios 添加导航栏视图_iOS进度栏(进度视图)
- Could not find an NgModule. Use the skip-import option to skip importing in NgModule.
- Hadoop2.0安装
- project各版本网盘免费下载
- Linux配置java环境变量
- java用php退出清除session_PHP学习笔记:删除与销毁session
- VS2008安装错误,解决方案
- Python教程:在Python中遍历列表详解
- 如何找到最新的RFC文档
- iSCSI网络SCSI接口
- 剑指offe面试题19——正则表达式匹配
- 4.4 Kali与windows xp之间搭建TFTP服务
- Plupload和错误生成
- 前端Number转千位符以及反转
- 878. 第 N 个神奇数字 数学+二分
- Django计算机毕业设计JAVA高校田径运动会管理(程序+LW)Python
热门文章
- 文字排版中的字号尺寸对照表(清晰、准确(含两个版本对比)、可复制)
- 不卡顿成用户购机第一要素,Mate 9深得人心
- css设置div垂直居中
- 全国计算机一级考试试题题库---附答案
- Wei Yang Bryan Lim, etc. Federated Learning in Mobile Edge Networks: A Comprehensive Survey.
- CSS 巧妙实现文字二次加粗再加边框
- 台湾-李宏毅教授的深度学习视频教程
- 华擎计算机主板配置,DDR+478+PCIEx16当下最平民化的计算机配置
- keil4和烧录软件的基本使用
- Origin8画图:将多个worksheet表画在同一张图