您的位置:首页 > 理论基础 > 数据结构算法

【学习心得】线程中要学会的内容

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息