线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

一、线程的分类

我们知道计算机可以分为硬件和软件两大块,硬件是基础,软件提供实现不同功能的手段;而软件又可以分为操作系统和应用程序,操作系统专注于对硬件的交互管理并提供一个运行环境给应用程序使用,应用程序则是能实现若干功能的并且运行在操作系统环境中的软件。

同样,线程按照操作系统和应用程序两层次可以分为内核线程(Kernel-Level Thread)和用户线程(User Thread)。

  • 内核线程(Kernel-Level Thread,KLT) 就是直接由操作系统内核(Kernel,下称内核)支持的线程,这种线程由内核来完成线程切换
  • 用户线程(User Thread,UT) 从广义上来讲,一个线程只要不是内核线程,就可以认为是用户线程;而狭义上的用户线程指的是完全建立在用户空间的线程库上,系统内核不感知线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助

二、Java线程的实现

Java创建线程的两种方式:实现Runnable接口,继承Thread类

  • 实现Runnable接口:写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动

    1. 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
    2. 线程体run()方法所在的类还可以从其他类继承一些有用的属性和方法,避免了由于Java的单继承特性带来的局限
    3. 有利于保持程序风格的一致性
  • 继承Thread类:写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
    1. Java中只支持单继承,Thread子类无法再从其他类继承
    2. 编写简单,run()方法的当前对象就是线程对象,可直接操纵

三、Java的线程优先级

Java使用的线程调度方式就是抢占式调度

虽然Java线程调度是系统自动完成的,但是我们还是可以“建议”系统给某些线程多分配一点执行时间,另外的一些线程则可以少分配一点——这项操作可以通过设置线程优先级来完成。

Java语言一共设置了10个级别的线程优先级(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在两个线程同时处于Ready状态时,优先级越高的线程越容易被系统选择执行。不过,线程优先级并不是太靠谱,原因是Java的线程是通过映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统,虽然现在很多操作系统都提供线程优先级的概念,但是并不见得能与Java线程的优先级一一对应,如Solaris中有2147483648(232)种优先级,但Windows中就只有7种,比Java线程优先级多的系统还好说,中间留下一点空位就可以了,但比Java线程优先级少的系统,就不得不出现几个优先级相同的情况了

下图显示了Java线程优先级与Windows线程优先级之间的对应关系,Windows平台的JDK中使用了除THREAD_PRIORITY_IDLE之外的其余6种线程优先级。

Java线程优先级 Windows线程优先级
1. Thread.MIN_PRIORITY THREAD_PRIORITY_LOWEST
2. THREAD_PRIORITY_LOWEST
3. THREAD_PRIORITY_BELOW_NORMAL
4. THREAD_PRIORITY_BELOW_NORMAL
5. Thread.NORM_PRIORITY THREAD_PRIORITY_NORMAL
6. THREAD_PRIORITY_ABOVE_NORMAL
7. THREAD_PRIORITY_ABOVE_NORMAL
8. THREAD_PRIORITY_HIGHEST
9. THREAD_PRIORITY_HIGHEST
10. Thread.MAX_PRIORITY THREAD_PRIORITY_CRITICAL

其实,即使设置了线程的优先级,一样无法确保这个线程一定先执行,因为它有很大的随机性。它并无法控制执行哪个线程,因为线程的执行,是抢占资源后才能执行的操作,而抢占到资源时,最多是给于线程优先级较高的线程一点机会而已,能不能抓住可是不一定的。

说到底就一句话:线程优化级较高的线程不一定先执行

四、Java线程生命周期

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。

  • 新建:就是刚使用new方法,new出来的线程;
  • 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
  • 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
  • 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
  • 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

完整的生命周期图如下:

Java并发篇_线程详解相关推荐

  1. Java并发编程最佳实例详解系列

    Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...

  2. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

  3. Java并发篇_进程线程

    一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 多线程能满足程序员编写高效率的程序 ...

  4. Java并发编程之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  5. Java并发编程之ConcurrentLinkedQueue详解

    简介 在并发编程中我们有时候需要使用线程安全的队列.如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两 ...

  6. java并发编程Future类详解

    作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时 ...

  7. Java并发篇_乐观锁与悲观锁

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展. 一.引入概念 1.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次 ...

  8. Java并发工具类--CyclicBarrier详解

    CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行. 举例 举个例子来 ...

  9. java并发编程之Volatile详解

    前言 在Java中多个线程对公共变量的操作并不是直接在内存中操作的,每一个线程都会有一块自己的工作内存.线程会先从主内存中获取到变量的值到工作内存中进行修改在更新到主内存.假如有两个线程同时对某个变量 ...

最新文章

  1. python 一份简单的车辆环视全景系统实现图像拼接缝融合
  2. java中字符串转化为Ascii码
  3. vue 箭头函数兼容性_前端学习计划之VUE学习(二)
  4. 太赞了!开源下载机器学习经典书 PRML所有相关资料:中文译本,官方代码,课程视频,学习笔记...
  5. 前端MVC Vue2学习总结(四)——条件渲染、列表渲染、事件处理器
  6. linux内核修改工程环境,linux2.6.33内核移植s3c2410以和交叉环境编译搭建最终修改版.pdf...
  7. 【转】刨根究底字符编码之二——关键术语解释(下)
  8. connection url mysql_JDBC URL格式及其参数说明 oracle mysql
  9. linux登陆提示鉴定故障_5个最常见的Linux问题的故障排除提示
  10. 驰骋工作流引擎2016年第1次组团培训日程
  11. 基于R语言利用QQ群进行数据挖掘案例整理
  12. 微信小程序、小游戏反编译获取源码
  13. jquery漂浮广告代码
  14. 内存的读写速度是硬盘的多少倍
  15. 5.2 强归纳法和良序性
  16. 解决:The ‘Access-Control-Allow-Origin‘ header contains___Nginx跨域设置
  17. Javascript验证信用卡号、信用卡类型(最全最新)
  18. c# rc4算法,加密解密类
  19. 元胞自动机--大黄蜂预测
  20. 51单片机定时器基础知识

热门文章

  1. dom文档对象手册_HTML5学习之DOM编程
  2. 电脑c语言怎么调出来的,c语言系统源代码_C语言判断系统版本的代码怎样将值调出来啊...
  3. php msgid排重,如何应用php数组对百万数据停止排重
  4. qt中创建控件布局以及删除原有布局和控件
  5. Python globals 函数 - Python零基础入门教程
  6. 其他机器无法访问php,PHP 局域网其他机器无法访问的问题
  7. cad设计院常用字体_趣谈 | 那些年我们看过的电气图纸(附CAD/EPLAN区别)
  8. pip 指定镜像源 指定版本 批量安装
  9. vlc-qt编译 linux,记录一次搞vlc官方源码中Qt示例工程的过程,文件路径对话框
  10. pandas 每一列相加_Python3 numpy amp; pandas 学习笔记