现在的位置: 首页 > 综合 > 正文

Guarded Suspension Patten —-java多线程模式(三)

2013年04月17日 ⁄ 综合 ⁄ 共 980字 ⁄ 字号 评论关闭

                              Guarded Suspension Patten ----java多线程模式(三)

   从一端代码开始说起:

   一个client的请求队列RequestQueue

    import java.util.LinkedList;

    public class RequestQueue{

       private final LinkedList queue = new LinkedList();//链表

       public synchronized Request getRequest(){//被锁定的方法,用于服务器端获得请求

       while(queue.size()<=0){//警戒条件。队列要不为空

       try{

              wait();//线程处于等待状态,释放锁

       }catch(InterruptException e){

       }

    }

      return (Request)queue.removeFirst(Request request);//当警戒条件满足时,返回队列的第一个元素

    }

 

   public synchronized void putRequest(Request request){//客户端往请求队列添加请求

     queue.addList(request);//改变警戒条件

     notifyAll();//唤醒所有的在waitset的线程

}

 

 

这就是我们Guarded Suspension Patten模式的经典代码,我们就里面的几点谈谈来掌握对这个模式的运用。

1.while循环,相当与单线程的if,因为单线程的模式下,警戒条件就会用if来限制,而在多线程里光用If是不起作用的,为什么呢?因为它只有一次判断,这样当警戒条件满足时下面的语句就有可能永远不会被执行。

 

2.另外还值得注意的是函数 putRequest里面的notifyAll()语句,想象如果没有这一句会是怎样的后果?

如果没有这句,那么尽管我们的警戒条件满足了(队列不再为空),但是我们的 getRequest还处于wait状态,没人去唤醒他,他就不会及时获得锁定来执行后面的语句。所以在运用这个模式时,不仅有函数能够改变警戒条件的值,还需要及时的唤醒正在等待的线程。

 

 

 

 

抱歉!评论已关闭.