---------------------- 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