关于线程间的交互和共享数据通常有轮询和通知机制。一下举例说明:Thread1和Thread2共享一块数据ShareData,Thread1使用数据,Thread2更新数据。当Thread1使用数据时发现数据没有更新就可以先休眠(sleep())一段时间然后再去判断是否更新,如此反复直到数据可用,这就是所述的轮询机制。可以看出轮询机制需要不断的轮询数据状态,很耗费资源;当采用通知机制时过程是这样的,Thread1发现数据不可用就在ShareData上等待(ShareData.wait()),当Thread2更新数据后就通知所有在ShareData上等待的线程(ShareData.notifyAll()),这样Thread1受到通知继续运行。
关于等待和休眠还有另一个区别就是当线程等待时,该线程锁定的资源是释放掉的,这时其它线程是可以锁定这些资源的,当线程被唤醒或者等待时限到时线程重新获取资源才能继续运行;而当线程休眠时线程锁定的资源是不被释放的。
还有一点就是要在对象lock上等待时是必须先要获取lock的对象锁才能进行的,即必须要类似下面的逻辑
synchronized(lock){ lock.wait()}
以下为一个简单的示例:
    
        
            
            | 
            
            package 
            
            sinpo.usagedemo;
            
 /**
 * 该例子说明线程休眠与等待以及注意事项。
 *
 * 
            @author 
            徐辛波(sinpo.xu@hotmail.com)
 * Oct 22, 2008
 */
 public class 
            
            PendingThreadDemo 
            {
 public 
            
            Console console = 
            
            new 
            
            Console
            ()
            ;
 private 
            
            
            void 
            
            writeToConsole1
            () {
 synchronized
            
            (
            console
            ){
 try 
            
            {
 Thread.sleep
            (
            1 
            * 
            1000
            )
            ;
            //NOTE:sleep时并未释放console别的线程是不能锁定console的
 //TODO do things
 } 
            
            catch 
            
            (
            InterruptedException e
            ) {
 e.printStackTrace
            ()
            ;
 }
 }
 }
 
 private 
            
            
            void 
            
            writeToConsole2
            () {
 synchronized
            
            (
            console
            ){
 try 
            
            {
 console.wait
            (
            1
            *
            1000
            )
            ;
            //NOTE:wait时别的线程是可以锁定console的
 //TODO do things
 } 
            
            catch 
            
            (
            InterruptedException e
            ) {
 e.printStackTrace
            ()
            ;
 }
 }
 }
 }
 //控制台类
 class 
            
            Console 
            {
 //TODO implements me
 }
 |