- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8_多线程编程的
第8章 Java的多线程;什么是线程?
线程是一个程序内的顺序控制流,使得一个程序具有能够“同时”执行多个任务的能力。
线程与进程
每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大,不同进程间交换数据困难。
线程: 轻量的进程,同一类线程共享代码和数据空间,线程切换的开销小。
多进程: 在操作系统中能同时运行多个任务(程序)。
多线程: 在同一应用程序中有多个顺序流同时执行。
线程可以理解为比进程更小的的程序单元。都具有并发执行多任务的能力,线程包含在进程内。;线程(Thread),也称执行上下文(Execution Context)包括:
虚拟CPU
线程体(Code)
线程数据(Data);Java使用Thread类描述线程对象,该类定义在java.lang包中。
在创建Thread对象的时候,一定要将线程体代码“提交”给线程对象。这可以从线程类构造器看出来。
Runnable接口,只要某个???象实现了Runnable接口的实现,就可以提交给线程对象。由线程执行该接口中封装的方法:public void run();
;使用Runnable接口(TestThread2.java)
可以将CPU,代码和数据分开,形成清晰的模型;
还可以从其他类继承;
保持程序风格的一致性。
直接继承Thread类(TestThread1.java)
不能再从其他类继承;
编写简单,可以直接操纵线程,无需使用Thread.currentThread()。
;直接继承Thread类;使用Runnable接口;两种方法的比较;没有保障的线程;没有保障的线程;没有保障的线程;没有保障的线程;线程控制:
启动,start方法。
终止,正常结束及stop方法。// stop方法已过时
挂起和恢复,suspend和resume方法。//已过时
睡眠,sleep方法。
释放执行权,yield方法。
join方法。
destroy方法。
//已过时
;public boolean isAlive() //测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。在start()方法后,线程才真正“运行”了 。
良好的终止线程的手段应该是向线程发“中断”通知,而不是直接调用stop方法。ThreadTerminateByFlag.java
暂时阻止线程的执行
不主张使用suspend()方法来暂时阻止线程的执行,不主张用resume()方法来恢复线程的执行
常用方法有:
sleep() 方法:当前线程挂起,一定时间后再运行
join() 方法:当前线程挂起,等待其他线程完成后再加入
yield() 方法:当前线程让步给其他线程
ThreadJoin.java;线程调度(分时time-slicing和抢先preemptive)
JVM不保证线程调度的算法,所以线程实际的运行行为会有很大差别,不同的JVM调度实现有可能是不一样的。
可以使用setPriority(int)方法来设置线程的优先级。
Java中用1-10表示运行的优先等级,等级越高,表示越紧急,在同一时间片断,有运行优先权
Thread类有三个有关线程优先级的静态常量:MIN_PRIORITY, MAX_PRIORITY,
NORM_PRIORITY
设置线程优先级的例子:TestThreadPriority.java
但是并不是所有的jvm的调度都这样,因此一定不能依赖于线程优先级来保证程序的正确操作,这仍然是没有保障的,要把线程优先级用作一种提高程序效率的方法,并且这种方法也不能依赖优先级的操作。
;线程控制方法:中断;如果多个线程同时访问相同的数据,那么会造成数据不安全(thread-unsafe)。
见例子ShareData.java:
之前的线程都是独立的,而且不是同步执行。但是,经常有些同时运行的线程需要共享数据,例如:一个线程从文件中读数据,另一线程向文件写数据,这就需要“同步”。;多线程访问共享数据造成数据的破坏的根源在于对数据操作的不完整性。
而且线程的运行行为依赖与操作系统的线程调度算法,具有不可预见性。所以前面的例子还会有其它的意外情况。
解决的办法就是线程的同步控制,对于临界资源的访问,线程之间必须是同步的。
将访问共享数据的代码修饰为同步代码,使用synchronized关键字。为资源加锁。
注意: synchronized声明不会被继承。;synchronized关键字;;wait, notify, notifyAll;调用某个对象的wait方法的线程必须拥有该对象的锁,否则会抛出IllegalMonitorStateException。wait方法调用一定要在同步代码内,否则,编译会通过,但运行失败。
原创力文档


文档评论(0)