Java线程实例讲解【原创】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入Java 线程 王伟 2009-07-30 一、什么是线程 为了清楚什么是线程,先了解一下程序和进程的概念。 程序就是源代码和文档的集合,如果经过编译后,就是目标平台可执行 的指令集合。程序是静态的。 相比之下,进程是动态的。操作系统加载可执行程序后,即产生了一系 统进程,由操作系统调度管理。现代操作系统都是多任务多用户的,意味着 操作系统可以调度许多进程。进程之间亦可以依赖于操作系统进行通信。进 程是重量级的,因为进程的调度需要耗费大量的CPU和内存资源。 线程是进程的进一步划分,可以认为一个进程由多个线程按各自的执行 路线运行而组成。由于线程共享同一个进程内存空间,线程间通信、调度开 销要比进程之间的通信、调度开销要小得多。因此,现在的应用程序往往会 采用多线程编程来提高性能。 二、创建Java线程 Java提供了语言级对线程的支持。Java中线程被抽象为对象,线程的 创建需要用到Thread类或者Runnable接口。也就是说线程类的编写有两种 方式:一种是扩展Thread类;另一种是实现Runnable接口。无论是哪一种 方式,线程的执行体都是run方法。 代码Thread_1,采用扩展Thread类的方式定义线程类 测试类: 代码Thread_2,采用实现Runnable接口的方式定义线程类 测试类: 三、Java线程的状态及常用方法 Java线程状态可以用下表描述: 状态 阻塞 可中断 描述 正运行 正在处理器上运行 准备运行 等待轮流获得处理器时间 休眠 √ √ 经过一段时间,或者被中断后准备运行 等待 √ √ 接到通知,或超时,或被中断后准备运行 阻塞于IO √ IO条件改变后准备运行 阻塞与同步 √ 获得锁后准备运行 以下是线程状态过渡示意图: Thread.start( ) 方法通知线程规化器这个线程已准备就绪,并尽快执行 线程,即执行线程类的run方法。这意味着编程只能控制线程进入准备运行 状态,何时真正运行则由线程规化器决定。 Thread.sleep( ) 方法将当前线程置入睡眠状态,进入睡眠状态的线程可能 被其他线程中断而采取某种行为。睡眠线程被中断时,sleep方法抛出一 InterruptException异常。 代码Thread_3 测试类: 输出结果: 在主线程(main方法)中,使用t3.interrupt( )中断了正在休眠的线程t3。 实际上,Thread.interrupt( ) 方法只是在目标线程中设置了一个标志,表示它 已经被中断,并立即返回。上例中,Thread.sleep( ) 方法检测到t3被中断, 因此中断t3的休眠状态并抛出InterruptionException。如果在调用sleep()之前 线程已经被interrupt ( )方法标志为中断,sleep( ) 会立即抛出。 InterruptionException异常。 代码Thread_4: main( ) 方法为主线程,Thread.currentThread( ) 方法能够获得当前线程的 引用,即主线程。在主线程休眠之前,主线程被标识为中断,因此sleep( ) 方法立即抛出InterruptionException异常。 再来看一个例子: 测试类代码: 创建了2个线程t1、t2,t1的优先级为最低,而t2则是最高优先级,如 果在线程类Thread_5中没有代码: 线程t1,几乎没有机会获得处理器来执行代码,出于等待状态,加上次代码 后,如果是t2获得了处理器,执行完输出后,会通过Thread.yeild( ) 方法主 动放弃使用处理器的权利,从而使得t1有机会执行。 对于Thread.stop( ) 、Thread.suspend( ) 、Thread.resume( ) 从Java 1.2之 后不再赞成使用,这里不予以介绍。 四、线程并发 先看到一个例子: 代码Thread_6: 代码SharedObject: 测试代码: 测试代码输出: 从输出我们首先可以发现,doWork方法被X线程调用的同时也被Y线 程调用。其次我们发现输出结果不正确,每个线程对value累加3次,value 最终结果应该是7,而不是6。 Thread.join( ) 方法的作用为等待线程结束,测试代码中,主线程输出 value的结果,需要在线程X、Y都结束的情况下输出。 从上例我们可以得出结论,如果存在多线程线程并发的情况,数据很容 易出现不一致的情况。Java多线程编程提供了两种机制来解决数据不一致的 问题,分别需要使用到关键字volatile和synchronized。 待续 附录、有关线程的JVM知识 什么是JVM 对Java虚拟机的理解,可以从以下三个方面着

文档评论(0)

yan666888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档