java中如何创建线程的四种⽅式,总结线程的五种状态之间如
何相互转换(⽤到哪些⽅法)
进程与线程:
进程:操作系统中的⼀个程序的执⾏周期称为⼀个进程
线程:⼀个程序同时执⾏多个任务。通常每⼀个任务称为⼀个线程,与进程相⽐,线程更“轻量级”,创建、撤销⼀个线程⽐启动⼀个新进程开销要⼩得多。没有进程就没有线程,进程⼀旦终⽌,其内的线程也将不复存在
多进程与多线程的区别:本质区别在于,每个进程都拥有⾃⼰的⼀套变量,⽽线程则共享数据。共享变量使得线程之间的通信⽐进程之间通信更加有效,更⽅便
在实际应⽤中,多线程体现在⼀个浏览器同时下载多个图⽚,qq收发消息同时进⾏
⾼并发:访问的线程量⾮常⾮常⾼
⾼并发带来的问题:服务器内存不够,⽆法处理新的请求
线程状态分为:创建、就绪、运⾏、阻塞、终⽌
java多线程的实现:创建多线程的四种⽅法(**********⾮常⾮常重要)
1.继承Thread类实现多线程
实例:
实现多线程之后,线程的正确调⽤⽅法应该是⽤实例化的对象调⽤start()⽅法。
原因⽐较复杂,只需要简单的来理解,在java中调⽤多线程时Thread定义了run()⽅法,jvm得到运⾏指令后,调⽤本地的run(),⽽Thread中的run()是由JVM创建完本地操作系统级线程后回调的⽅法,
只需要记得在启动线程时,调⽤start()⽅法,如果调⽤run()⽅法的话,就会将run()⽅法当做⼀个普通⽅法调⽤
每⼀个线程对象只能启动⼀次,多次启动会报错,也就是说⼀个myThread只能调⽤start()⼀次。
run()⽅法⾥⾯写的是线程需要完成什么,也就是线程的逻辑
2.Runnable()接⼝实现多继承
实例:
Thread类的核⼼功能是进⾏线程的启动。如果⼀个类为了实现多线程⽽直接去继承Thread就会有单继承局限,所以在java中提供了Runnable接⼝,在Runnable接⼝启动时同样是调⽤start()⽅法,但是⼤家可以看到试讲MytareadR的对象传⼊到Thread实例化的对象⾥才能够调⽤start()⽅法,这同样和⼀开始说的start()的调⽤⽅式有关,在JVM底层回调run⽅法时,需要传⼊⼀个对象进去,但是为什么继承Thread不⽤呢,因为继承Thread时,默认返回的那个对象就是Thread,⽽实现Runnable接⼝时,需要把Runnable接⼝的对象传⼊进去,所以需要先传⼊myThreadR进⼊到Threa thread中。
Thread与Runnable的区别:
1.Runnable避免了单继承局限,Thread是Runnable接⼝的⼦类
2.使⽤Runnabe实现多继承可以更好地描述出程序共享的概念
3.代理设计模式(两个接⼝,⼀个⽤来实现真正的业务操作,另⼀个⽤来完成资源的调动,辅助真实业务的完成)
3.Callable实现多继承(JDK1.5以后追加的新的开发包,主要⽤于⾼并发编程)
实例:
在Callable实现多线程拥有返回值,得到返回值的⽅法时,使⽤FutureTask的对象调⽤get()⽅法
4.使⽤线程池进⾏多线程(该⽅法⽐较复杂,在最新的博客⾥会⽤单独的⼀个博客来写)
线程相关的操作⽅法:
取得线程名称:
设置线程⽅法:在创建线程的时候设置名称
取得当前线程对象:
设置线程优先级:
java线程池创建的四种⾸先解释下优先级的概念,多线程是同时进⾏的,但是我们可以通过设置优先级的⽅式让指定线程⼤概率的优先执⾏,这⾥我说的是⼤概率!设置线程优先级能够使线程优先级⾼的⼤概率的优先执⾏,是⼤概率!不是肯定!这⾥⼀定要注意!
⽅法:
优先级:从0-10;越⼤越⾼,缺省的数值是5
join()⽅法:等待该线程终⽌,意思就是如果在主线程中调⽤该⽅法时,就会让主线程休眠,调⽤该⽅法的线程的run⽅法执⾏完毕后再开始执⾏主线程 使⽤该⽅法时会抛出⼀个异常
实例:为添加之前:
结果:
添加之后:
线程让步:yield()⽅法
暂停当前正在执⾏的线程对象,并执⾏其他线程
结果:
线程休眠:sleep();指的是让线程暂缓执⾏⼀下,等到了预计时间之后再恢复执⾏,这个⽅法会抛出⼀个异常
输出的形式是卡顿的形式输出,图⽚⽆法演⽰,可以⾃⼰亲⾃动⼿试⼀下
线程停⽌:
a.设置标志位,让线程正常退出 《推荐使⽤第⼀种》
b.使⽤stop()强制让线程停⽌,JDK9彻底没有了
c.使⽤Thread中的interrupt()中断线程 《分两种情况》
a:
结果:
C:使⽤interrupt()
第⼀种情况:线程中出现sleep、wait、join()⽅法,使⽤Thread.interr()会将线程状态设置为打断状态,根据此状态⼈为进⾏线程终⽌
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论