Java并发篇_线程详解

线程(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_PRIORITYTHREAD_PRIORITY_LOWEST
2.THREAD_PRIORITY_LOWEST
3.THREAD_PRIORITY_BELOW_NORMAL
4.THREAD_PRIORITY_BELOW_NORMAL
5. Thread.NORM_PRIORITYTHREAD_PRIORITY_NORMAL
6.THREAD_PRIORITY_ABOVE_NORMAL
7.THREAD_PRIORITY_ABOVE_NORMAL
8.THREAD_PRIORITY_HIGHEST
9.THREAD_PRIORITY_HIGHEST
10. Thread.MAX_PRIORITYTHREAD_PRIORITY_CRITICAL

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

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

四、Java线程生命周期

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

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

完整的生命周期图如下:

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改MYSQL最大连接数的3种方法

MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两个 方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections100 …

可扩展的编程语言——Scala

一、Scala是什么 Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。 ​ Scala语言的名称来自于"可伸展的语言"。之所以…

ubuntu7.10 apache+php+mysql配置

本篇文章 经过许多次的测试和修改已经完成了在Ubuntu7.10 下 安装配置 ApachePHPMySQL的所有的工作. 1、在Ubuntu7.10 下安装 Apache2PHP5MySQL sudo apt-get install apache2 libapache2-mod-php5 php5 php5-gd mysql-server php5-mysql phpmyadmin在下载来自动安装配置的时候…

Spark-大规模数据处理计算引擎

官网:http://spark.apache.org 一、Spark是什么 Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。项目是…

MySQL Replace INTO的使用

REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。请参见13.2.4节,“INSERT语法”。 注意,除非表有…

CentOS7下Spark集群的安装

从物理部署层面上来看,Spark主要分为两种类型的节点,Master节点和Worker节点,Master节点主要运行集群管理器的中心化部分,所承载的作用是分配Application到Worker节点,维护Worker节点,Driver,Ap…

Scala中class与object区别

calss scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set scala 中没有 static 关键字,所以 对于一个class来说,所有的方法和成员变量在实例被 new 出来之前都是无法访问的 因此在class中的main方法没什么用了 scala 的object 中所有成员…

如何编写一个shell脚本

本文结合大量实例阐述如何编写一个shell脚本。 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的…

Scala变量和常用数据类型

一、 声明值和变量 Scala声明变量有两种方式,一个用val,一个用var。 声明方式:val / var 变量名 : 变量类型 变量值 val定义的值是不可变的,它不是一个常量,是不可变量,或称之为只读变量。 val示例&am…

ubuntu7.10下的vi用的怪怪的

到网上查了一下,原来是ubuntu7.10默认安装的是vim-tiny.可以重新安装vim-full #dpkg -l 如果是vim-tiny #apt-get install vim-full

(转)JVM监控工具介绍

2008年03月04日 16:57原作者: stone2083 原文地址:http://www.blogjava.net/stone2083/archive/2008/02/25/182081.htmljstatd启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。实例:…

Scala的控制结构

一、 if else表达式 scala中没有三目运算符,因为根本不需要。scala中if else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型)。 例如:if else返回类型一样 scal…

【Kubernetes】控制器Statefulset

Statefulset控制器 一、概念二、Statefulset资源清单文件编写技巧2.1、查看定义Statefulset资源需要的字段2.2、查看statefulset.spec字段如何定义2.3、查看statefulset的spec.template字段如何定义 三、Statefulset使用案例:部署web站点3.1、编写一个Statefulset资…

Scala 函数

scala定义函数的标准格式为: def 函数名(参数名1: 参数类型1, 参数名2: 参数类型2) : 返回类型 {函数体} 函数示例1:返回Unit类型的函数 def shout1(content: String) : Unit {println(content) }函数示例2:返回Unit类型的函数&#xff0…

ubuntu7.10中的apache的一些设置

在/etc/apache2/mods-available目录下是apache2可用的模块.出现在这里的模块不代表你可以用.只是表明你的apache2已经安装了这些模块.可用的模块在/etc/apache2/mods-enabled这个目录下.(从redhat系列转过来看ubuntu,虽然感觉不习惯,但觉得ubuntu的这种分目录的方法很不错.) 如…

Java并发篇_Java内存模型

在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。那么它们产生的原因和在Java中解决的办法又是什么呢? 一、内存模型的相关概念 ​ 计算机在执行程序时,每条指令都是在CPU中执…

rz的安装

以前,在redhat系列的linux中,通过终端工具操作服务器,经常使用rz来上传小文件.但是有些系统默认情况下不能使用此命令.今天通过ubuntu.看到这条命令.即使ubunt没有装这个命令,你输入此命令时,它会提示你进行安装. rootubuntu:~# rzThe program rz is currently not installed. …

Java并发篇_synchronized

synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中的用法。 一、为什么要使用synchronized 在并发编程中存在线程安全问题,主要原因有&…

mysqlreport的学习

mysqlreport是一个脚本. 需要先安装perl-DBI和perl-DBD-MySQL这2个包 mysqlreport 使用DBI 需要有http://hackmysql.com/mysqlreportdocperl ./mysqlreport --help 看帮助 perl ./mysqlreport --user root --password 密码mysqlreport 文档mysqlreport 以很友好的方式显示 My…

Java并发篇_volatile

volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级&#xff…