java多线程知识_学习知库丨Java多线程知识大全

635298bfe34d53ad85b52a9eaca6c4c7.png

6d779d4ffafc4bbccf37057fc38775d6.png

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。

线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

多进程是指操作系统能同时运行多个任务(程序);多线程是指在同一程序中有多个顺序流在执行。

线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。

在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

1

扩展java.lang.Thread类

程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用其他对象的start方法,另外的线程也启动了,这样,整个应用就在多线程下运行。

注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。

Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。

实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。但是start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常。

2

实现java.lang.Runnable接口

通过实现Runnable接口,使得类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。

在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。

实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。

3

Thread和Runnable的区别

实现Runnable接口比继承Thread类所具有的优势:

1)适合多个相同的程序代码的线程去处理同一个资源;

2)可以避免java中的单继承的限制;

3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

4

线程状态转换

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

1》等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

2》同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

3》其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

5

线程调度

1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。

Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:

static int MAX_PRIORITY

线程可以具有的最高优先级,取值为10。

static int MIN_PRIORITY

线程可以具有的最低优先级,取值为1。

static int NORM_PRIORITY

分配给线程的默认优先级,取值为5。

Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。

每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。

线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。

JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。

2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。

4、线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。

5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。

6

线程同步

1、synchronized关键字的作用域有二种:

一种是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;

第二种是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。

2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;

3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

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

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

相关文章

螺旋遍历_螺旋形式的水平阶遍历

螺旋遍历Problem statement: 问题陈述: Write a program to print Level Order Traversal in spiral form of a binary tree. 编写一个程序以二叉树的螺旋形式打印Level Level Traversal 。 Example: 例: For the above tree:Basic level order trave…

SharePoint2007安装图文详解二:安装AD(活动目录)及DNS

在上一篇SharePoint2007安装图文详解一:安装IIS及相关组件中已经介绍了IIS及相关组件的安装,本篇将详细介绍AD(活动目录)的安装。 打开“管理您的服务器”,点击“添加或删除角色” 点击“添加或删除角色”后弹出“配置…

php的foreach

作用&#xff1a;遍历数组 索引数组 形式&#xff1a;foreach(数组 as 值){ //操作 } <?phpheader(content-type:text/html;charsetutf-8);$personarray(DL_one,18,man);foreach($person as $chara){echo $chara,<br>;} ?>2. 关联数组 形式&#xff1a;foreach…

strcmp java_C语言中strcmp的实现原型

C语言中strcmp的实现原型实现代码&#xff1a;int __cdecl strcmp (const char * src,const char * dst){int ret 0 ;while( ! (ret *(unsigned char *)src - *(unsigned char *)dst) && *dst)src, dst;if ( ret < 0 )ret -1 ;else if ( ret > 0 )ret 1 ;ret…

带有Python示例的math.sin()方法

Python math.sin()方法 (Python math.sin() method) math.sin() method is a library method of math module, it is used to get the sine of the number in radians, it accepts a number returns the cosine of the given number in radians. math.sin()方法是数学模块的库方…

ExtJs实践(3)——xtype名称与控件对应

xtype可作为Ext控件的简写&#xff0c;都会对应一个Ext控件。当然这里你也可以自定义这个xtype&#xff0c;通过自定义的Ext控件来绑定&#xff0c;主要由Ext.reg方法去注册xtype。Ext.all.js里面包含的xtype包含&#xff1a; xtype Class ------------- -------…

fmax()函数以及C ++中的示例

C fmax()函数 (C fmax() function) fmax() function is a library function of cmath header, it is used to find the maximum value of the given numbers, it accepts two number and returns the larger one. fmax()函数是cmath标头的库函数&#xff0c;用于查找给定数字的…

java date传输类型错误_转换日期格式:Java中的转换错误?

我正在尝试将此日期转换为其他格式。不幸的是&#xff0c;他们成功地解析了日期并正确地保留了所有信息。06-Dec-2017 07&#xff1a;14&#xff1a;56.656PM至2017-12-06 19&#xff1a;14&#xff1a;56.656如果我尝试解析输入日期LocalDateTime.parse("06-Dec-2017 07:…

Linux 2440 LCD 控制器

嵌入式Linux之我行&#xff0c;主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验&#xff0c;二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处&#xff0c;谢请指正。共享资源&#xff0c;欢迎转载&#xff1a;http://hbhuanggang.cublog.cn 一、开…

python 示例_Python中带有示例的关键字除外

python 示例Python关键字除外 (Python except keyword) except is a keyword (case-sensitive) in python, it is used with try... except statement to handle the exception. 除了是python中的一个关键字(区分大小写)&#xff0c;它与try ... except语句一起使用来处理异常。…

java中使用es精准查询_使用ES简单查询语句须知

查询样例{"query": { //1"bool": { ///2"must": [{ //3"query_string": {"default_field": "xxxz","query": " *XXX* "}}],"should": [], //4"must_not": [], 5"fi…

php的create_function、function_exists判断函数是否存在

create_function 格式&#xff1a;create_function(‘参数’,‘函数体代码’) 作用&#xff1a;创建匿名函数 <?phpheader(content-type:text/html;charsetutf-8);$func create_function($a,$b, return ($a$b););echo $func(10,20); ?>function_exists 返回值为boo…

python中dict函数_dict()函数以及Python中的示例

python中dict函数Python dict()函数 (Python dict() function) dict() function is a library function, it is used to create a dictionary with keywords( Ids) and values (s), it accepts a set of values with keywords, values and returns a dictionary. dict()函数是…

最佳ASP.NET编程习惯

初学编程的朋友往往喜欢收集一些很“奇妙”的编程技巧&#xff0c;然而&#xff0c;技巧的积累往往并没有提高程序质量&#xff0c;反而引导一些编程者一味追求奇和新&#xff0c;忘记了基本编程习惯的培养&#xff0c;不利于团队的合作&#xff0c;可能&#xff0c;这也是中国…

php的传值与传址

默认情况下&#xff0c;函数的参数都表示是值传递&#xff0c;但是&#xff0c;如果在定义函数的参数前面加上取地址符&#xff0c;表示传递的是地址值 传值&#xff1a; <?phpheader(content-type:text/html;charsetutf-8);function changeValue($num){$num10;}$value5;c…

IBM System p5 服务器 HACMP 安装指南

一. 系统需求 1.1 硬件需求 IBM HACMP 支持所有 IBM System p5 服务器。 1.2 软件需求 1.2.1 AIX 与 RSCT 版本要求 AIX 5L Version RSCT Version RSCT Filesets AIX 5L Version 5.3 TL1 2.4.2 rsct.compat.basic.hacmp 2.4.2.0 rsct.compat.clients.hacmp 2.4.2.0 rsct.…

学java要学vue吗_学vue之前必看

Vue学习1.1 vue.js是什么&#xff1f;​ Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c…

python 全局_全局关键字,带Python示例

python 全局Python全局关键字 (Python global keyword) global is a keyword (case-sensitive) in python, it is used to declare a global variable inside a function (from a non-global scope). global是python中的一个关键字(区分大小写)&#xff0c;用于在函数内部声明…

php中函数的默认值,参数的顺序

形式参数可以在定义时候给参数赋一个默认值&#xff0c;默认值不能是一个变量&#xff0c;可以是常量&#xff0c;当调用函数时&#xff0c;如果没有参数&#xff0c;函数就会按照默认值处理&#xff0c;如果传递了参数&#xff0c;就按照传递的参数处理 <?phpheader(cont…

.NET Enterprise Services Performance

http://msdn.microsoft.com/library/default.asp?url/library/en-us/dncomser/html/entsvcperf.asp?frametrue Summary: See the performance of native COM and .NET Enterprise Services components when applied to different activation and calling patterns. Get guide…