




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java多线程处理机制本讲目标进程、线程的概念及区别创建线程的方式线程状态线程调度和线程控制线程优先级线程同步死锁的概念使用wait()和notify()在线程之间进行通信4进程、线程的概念及区别进程的概念进程一般是对操作系统而言。例如在windows操作系统中,你打开word编辑文档的同时,可以进行迅雷下载。我们可以说此时系统内部有两个进程在运行。即windows操作系统是多任务操作系统。那么进程可以理解为程序的一次动态执行过程。线程的概念线程一般是对某一个程序而言的,如在进行迅雷下载的同时,还可以查看已经下载的任务列表,这两件事没有相互干扰,那么我们说此时这一程序中至少有两个线程在运行。那么线程可以理解为程序中的一个运行分支。5进程、线程的概念及区别进程和线程的区别两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。不同进程的代码内部数据和状态都是完全独立的,而一个程序内的多线程是共享用一块内存空间和同一组系统资源,有可能互相影响进程间的通信要比线程间的通信效率低。6进程、线程的概念及区别多线程的概念多线程在Java中,一个应用程序可以包含多个线程(多个分支)。每个线程执行特定的任务,并可与其他线程并发执行
多线程使系统的空转时间最少,提高CPU利用率多线程编程环境用方便的模型隐藏CPU在任务间切换的事实7进程、线程的概念及区别多线程的概念主线程在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。主线程的重要性体现在两个方面:它是产生其他子线程的线程。通常它必须最后完成执行,因为它执行各种关闭动作。8进程、线程的概念及区别classMythreadextendsThread{publicstaticvoidmain(Stringargs[]){
Threadt=Thread.currentThread();System.out.println("当前线程是:"+t);t.setName("MyJavaThread");System.out.println("当前线程名是:"+t);try{for(inti=0;i<3;i++){System.out.println(i);Thread.sleep(1500);
}}catch(InterruptedExceptione){System.out.println("主线程被中断");}}}获得当前线程,即主线程改变线程的内部名称输出每个数后暂停1500毫秒主线程案例9创建线程的方式java有两种方式实现多线程编程继承Thread类实现Runnable接口10创建线程的方式方式一:继承Thread类实现步骤:继承Thread类覆盖Thread的run()方法,将你要让线程做的事写在run方法中。有时候可以需要用循环,使你的代码一直执行下去。New这个Thead子类,得到一个对象调用这个对象的start()方法。线程被启动,开始执行run()中的代码。11创建线程的方式案例:实现一个定时线程,即线程在给定期间每隔一定时间(1秒),屏幕显示时间累计数(秒数),时间结束时线程自动停止、撤消。12创建线程的方式方式一:实现Runnable接口实现步骤:提供一个实现接口Runnable的类,实现run()方法。得到这个类的实例A。New一个Thread对象,同时A作为参数传入。例如:Threadrunner=newThread(A);调用start启动线程例如:runner.start();注意点:由于继承了Thread后,类再不能继承别的类,所以一般我们采用实现Runnable接口的方法来创建线程。13创建线程的方式案例:利用第一个方式(Runnable接口)实现一个定时线程。14创建线程的方式线程两种创建方式的比较实现Runnable接口的优势符合OO设计思想便于用extends继承其他类采用继承Thread类方法的优点:程序代码更简单151、创建新线程,输出0到100000。用继承Thread的形式2、用实现Runnable接口的形式,创建线程,完成实现输出task1、task2、task3。16线程的状态线程状态
新建(new):和其他java对象一样,只分配内存空间和初始化成员变量就绪(Runnable):调用了start()方法之后进入就绪状态,什么时候运行取决于线程的调度器运行(Running):获取时间片,开始执行run方法体阻塞(Blocked):失去cpu的占用权,让其他线程有机会运行死亡(Dead):run方法体执行完,正常结束或者抛出Exception或者调用stop()方法(不推荐)17线程的状态18线程调度和线程控制线程的调度策略线程的基本控制19线程调度和线程控制线程的调度策略java中线程调度采用抢占式调度方法。抢占式调度模式:
许多线程可能是可运行状态,但只能有一个线程在运行,该线程将持续运行,知道它自行终止或者是由于其他的事件导致阻塞亦或者是出现高优先级线程成为可运行的,则该线程失去CPU的占用权。20线程调度和线程控制方法方法说明start()启动线程,使线程进入可运行状态run()线程进入运行状态getPriority()/setPriority()获取/设置线程优先级sleep()线程睡眠指定一段时间join()是Thread类中的一个实例方法。一个线程调用另一个线程的join()方法可以使自己暂停运行,直到另一个线程终止。yield()线程放弃执行,使其他优先级不低于此线程的线程有机会运行,它是一个静态方法线程的控制21线程调度和线程控制方法方法说明wait()线程进入等待状态,等待被notify,是一个实例方法。notify()/notifyAll()唤醒其他的线程,是一个实例方法suspend()挂起该线程(不推荐使用)resume()唤醒该线程,与suspend相对(不推荐使用)线程的控制22线程调度和线程控制线程的控制join()方法:
23线程调度和线程控制线程的控制yield()方法:线程放弃执行,使其他优先级不低于此线程的线程有机会运行,它是一个静态方法24线程调度和线程控制sleep()和wait()有什么区别?sleep是线程类(thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyall)后本线程才进入对象锁定池准备获得对象锁进入运行状态。25线程调度和线程控制stop()和suspend()方法为何不推荐使用?反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。26线程调度和线程控制stop()和suspend()方法为何不推荐使用?suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。27线程优先级Java中的线程优先级是在Thread类中定义的常量NORM_PRIORITY:值为5MAX_PRIORITY:值为10MIN_PRIORITY:值为1缺省优先级为NORM_PRIORITY有关优先级的方法有两个:finalvoidsetPriority(intnewp):修改线程的当前优先级finalintgetPriority():返回线程的优先级28线程优先级线程继承父类的优先级有关优先级的原则:优先级高者优先优先级相同的“先进先出”切换规则:自动放弃高优先权抢占291、创建3个线程分别输出0到3,但是3个线程要设为不同的优先级,分别为Thread.MAX_PRIORITY、Thread.NORM_PRIORITY、Thread.MIN_PRIORITY。测试是哪个线程优先抢占cpu。30线程同步概念:有时两个或多个线程可能会试图同时访问一个资源例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据在此情况下,数据可能会变得不一致为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步”31线程同步多线程访问共享资源案例:模拟售火车票过程32线程同步
如何在Java中获得同步同步基于“监视器”这一概念。“监视器”是用作互斥锁的对象。在给定时刻,只有一个线程可以拥有监视器。Java中所有的对象都拥有自己的监视器两种方式实现同步:使用同步方法synchronizedvoidmethodA(){}使用同步块synchronized(object){ //要同步的语句}331、使用线程同步解决买票过程出现的问题。34死锁当两个线程循环依赖于一对同步对象时将发生死锁。
例如:
有两个锁A,B,一个线程拿到A锁,请求B锁。另一个线程拿到B锁,请求A锁。那么,这两个线程将进入死锁。进入死锁,即程序死掉了。死锁很少发生,但一旦发生就很难调试。351、死锁案例演示36使用wait()、notify()在线程间通信
wait-notify机制-1为避免轮流检测,Java提供了一个精心设计的线程间通信机制,使用wait()、notify()和notifyAll()方法这些方法是作为Object类中的final方法实现的这三个方法仅在synchronized方法中才能被调用37使用wait()和notify()在线程间通信wait-notify机制-2wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医生职业资格考试试卷及答案
- 2025年养老服务与管理考试试卷及答案分享
- 2025年物流管理师考试题及答案
- 2025年体育老师资格认证考试试卷及答案
- 2025年区域规划与管理政策分析考试试题及答案
- 2025年伦理学与法律课程考核试卷及答案
- 2025年计算机科学专业考试试题及答案
- 2025年金融科技专业资格考试试卷及答案
- 2025年儿童与青少年心理健康考试题及答案
- 2025年公共关系管理考试试题及答案
- 2024年上海浦东新区公办学校储备教师教辅招聘真题
- 2025年高考历史全国卷试题评析-教育部教育考试院
- 贵州省贵阳市2023−2024学年度第二学期期末监测试卷高一 数学试题(含解析)
- 井冈山的故事试题及答案
- 城市管理公司管理制度
- 2025年中国合成生物学行业市场前景预测及投资价值评估分析报告
- 游艺项目合作合同协议书
- 触电急救97课件
- T/CAQI 96-2019产品质量鉴定程序规范总则
- 育婴师上户合同范本
- 医疗行业注塑车间的数字化改造实践
评论
0/150
提交评论