【学习心得】线程中要学会的内容
2011-09-27 20:38
246 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
线程是基于多任务的环境中的,是可供调用的最小代码单元,它将任务分解成分散的逻辑单元,也就是说一个程序可以调用多个线程任务。
每一个线程定义了一个独立的运行路径,线程也是多任务的一种特殊形式。线程中最需要我们注意的是同步机制,线程间通信,暂停、恢复、停
止线程,还有死锁。
同步机制
我们在开发程序时经常会遇到多个线程需要访问同一个共享资源,最典型的就是生产者和消费者例子,很显然我们要用一种机制控制生产者
和消费者对商品的访问,确保一次只有一个线程在访问共享资源,这个方法就是同步,同步其实核心是一个信号量,或者说锁,一旦获得这个锁
,其他的线程就无法访问共享资源了。以前学习系统结构时我们就详细的学习过同步机制,这里只说java实现同步的方法,主要是用
synchronized关键字,它可以修饰方法,还可以把类作为参数实现对类中方法的同步(主要应用在不能访问同步类的源代码时),一般形式如下
synchronized(object){};具体的解释可以参照API帮助文档。还有一种新的同步实现方法是使用同步对象,最典型的同步对象就是Semaphore
,它其实就是一个信号量,然后这个信号量通过计数来控制对共享资源的访问,具体的构造函数和使用方法可以去查API文档,该类在
java.util.concurrent包中,该包中还有相应的类实现“等待”,“通信”等功能。
线程间通信
线程间通信简单的说就是一个线程运行结束(暂停)了,通知其他等待运行的线程可以去运行了。java通过wait(),notify(),和notifyAll
()方法实现线程间的通信机制。wait()告诉线程放弃监控器(释放资源)并进入睡眠状态,直到其他线程进入同一监控器并调用notify()或
者notifyAll()方法来唤醒它;
notify()唤醒在同一对象(同一个监控器)上调用的wait()的线程;
notifyAll()唤醒在同一对象(同一监控器)上所有调用wait()线程。
最好还要注意,wait()方法要抛出异常,因为它在执行的时候可能会被中断。
线程的暂停、恢复、和停止
首先要说下,线程的暂停、恢复、和停止的早期方法是不建议使用的,因为它们可能导致系统失败(如果一个线程获得了关键数据结构的锁
,如果这时它被暂停,那么它就不会释放锁,其他等待这个关键数据的线程就会一直等待(可能产生死锁))。现代代码的解决办法是在这些方
法上加上标志,这个标志来决定线程是否该暂停,恢复和停止。
死锁
死锁理解很简单,就是多个等待着的线程占有对方运行时的资源不释放,导致大家都一直等待着的一种状态。死锁一般很少发生,但是我们
必须引起重视,一旦死锁,程序就只能被强制停止,否则一直运行。在编写代码时要充分考虑资源的获取和释放问题,尽量避免死锁。
---------------------- android培训、java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima
相关文章推荐
- Java学习心得之线程(一)
- IOS进程与线程学习心得体会
- java中怎么终止一个线程的执行----个人学习心得
- pringMvc学习心得(四)springmvc中request的线程安全问题
- coursera课程learning how to learn的主要内容-学会学习(一)
- centos 学习日记 less 学会使用一个文件内容查阅
- Handler线程学习心得
- 嵌入式每日学习心得 进程与线程
- MFC学习笔记——线程中控制窗口内容 .
- Java学习心得--线程、匿名内部类
- 每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容
- 蓝懿iOS 技术内容交流和学习心得 10.27
- 蓝懿ios 技术内容交流和学习心得 11.13
- 每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容
- 2 学习内容 及心得
- 蓝懿ios 技术内容交流和学习心得 11.12
- 蓝懿ios 技术内容交流和学习心得 11.14
- 蓝懿iOS 技术内容交流和学习心得 11.16
- 蓝懿ios 技术内容交流和学习心得 11.18
- Java学习心得之线程(二)