JAVA开发自学教材15多线程.pptVIP

  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开发自学教材15多线程

我们了解到线程是排序完成的,但是线程可能会出现冲突,那怎么办呢,我们可以是用线程协作来解决这个问题, 这个问题是典型的生成者和消费者的问题,看一下 看一下这个例子 当多个线程访问同一个资源的时候就会出现死锁的概念,看这个例子, 那么怎么解决这个问题呢,我们可以用线程排序来解决。, 我们看一下锁的概念,上面的程序为什么能实现数据共享呢?是因为这个线程在访问一个数据的时候是给这个数据加锁的,这时其他的线程就不能使用这个数据了,直到这个锁解开为止。 这需呀同学们好好的理解这个概念, 当我们给某个程序加了synchronized后,这时这段代码就不能被两个线程同时执行了,因为这段程序加了锁,但是有一个特殊情况就是这两个线程等待的是同一个锁。 Synchronized这个修饰方法,意味着这个方法会被上锁。 线程协作 我们已了解线程之间可能的冲突,以及怎样避免冲突;下一步就要学习怎样使线程之间相互协作 这种协作是通过线程之间的握手来实现的,这种握手可以通过Object的wait()和notify()来安全的实现 典型问题:生产者消费者问题(见下页) 生产者消费者 举例 有一家汉堡店举办吃汉堡比赛,决赛时有3个顾客来吃,3个厨师来做,一个服务员负责协调汉堡的数量。为了避免浪费,制作好的汉堡被放进一个能装有10个汉堡的长条状容器中,按照先进先出的原则取汉堡。如果容器被装满,则厨师停止做汉堡,如果顾客发现容器内的汉堡吃完了,就可以拍响容器上的闹铃,提醒厨师再做几个汉堡出来。此时服务员过来安抚顾客,让他等待。而一旦厨师的汉堡做出来,就会让服务员通知顾客,汉堡做好了,让顾客继续过来取汉堡。 顾客其实就是我们所说的消费者,而厨师就是生产者 演示示例11:线程协作 wait()notify() 当一个线程在方法里遇到了wait()的调用时,线程的执行被挂起,wait()关联的对象上的锁被释放 wait()可带参数,常见情况是不带参数,意味着将无限等待直到线程接收到notify或notifyAll消息 调用wait、notify、notifyAll的线程在调用这些方法前必需获取对象的锁 面试笔试常考 wait和sleep的区别 wait是Object方法, sleep是Thread静态方法 wait释放锁,sleep不会释放 wait调用前必须获得锁,sleep没有这个要求 wait和sleep都可以设定自动恢复的时间,但wait主要是通过notify/notifyAll来唤醒 相同点在于都会造成线程阻塞 更高级的线程主题 线程组 线程池 线程间复杂协作 参考著作 Java concurrency in practice 谢谢! * * * * * * * * 本堂课结束,谢谢大家! 进程是操作系统的概念,指的是独立运行的程序。所有在计算机里运行的程序都是一个一个的进程。进程是相互隔离的。 线程存在于进程当中,又称为轻量进程。也就是他和进程是类似的。但是他有一个共同的特点就是可以共享彼此之间的数据。 比如我开一个qq,那么这个qq就是一个进程,我再开一个就又多了一个进程。 我用qq和十个人聊天,那么就相当于开了10个线程。 迅雷下载也是这个道理。 早期的程序都是一个进程中只有一个线程的,叫单线程进程。我们之前开发的程序都是单线程的。程序可以运行多次,每次都是一个进程。 而我们现在运行的很多程序都是多线程的。 既然我们现在的程序都是多线程的,那么多线程有什么好处呢? 1、例如我们监听键盘输入。 2、例如我刚才说的qq或者是迅雷下载。 3、提升了程序的并发性,可以同时执行多个功能。 4、避免因为一个进程的错误而导致整个程序死机。 总之使用多线程的好处就是提高系统的性能。 多线程和进程调度是类似的。是使用的时间片轮询调度策略来完成的。在调度的过程中是按照优先级进行的。 那么线程具体是怎么通过时间片轮询来完成的呢?我们来看下一个例子。 线程有三个标准状态,一是ready(runnable)二是running 三是blocked 。还有两个临时状态,一个是new一个是dead。 具体运行的方式是这样的。比如说我们学校的食堂,现在就有一个窗口(cpu)。现在有很多的同学(线程)来吃饭,但是我们这有规矩吃饭只能在窗口吃。那该怎么吃呢,一个一个的吃?前面吃不了几个后面就饿死了。所以我们可以这么来做,每个人吃一分钟。然后下一个来吃。。。。 前面我们讲了原理和机制,现在我们看一下如何使用线程。 所有我们开发的class都可以继承thread类或者实现runnable接口。那么这两个选择哪个呢?选择实现runnable接口更合适。因为使用接口可以实现多继承。(thread类也是实现runnable接口的)。 如何使用线程呢,我们看一下这两种方法的使用。 参考word文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档