WEB开发网
开发学院软件开发Java Active Object 并发模式在 Java 中的应用 阅读

Active Object 并发模式在 Java 中的应用

 2010-08-06 00:00:00 来源:WEB开发网   
核心提示: Activation List 的实际上就是一个线程同步机制保护下的 Method Request 队列,对该队列的所有操作 (insert/remove) 都应该是线程安全的,Active Object 并发模式在 Java 中的应用(7),从本质上讲,Activation List 所基于的

Activation List 的实际上就是一个线程同步机制保护下的 Method Request 队列,对该队列的所有操作 (insert/remove) 都应该是线程安全的。从本质上讲,Activation List 所基于的就是典型的生产者 / 消费者并发编程模型,调用者线程作为生产者把 Method Request 放入该队列,Active Object 线程作为消费者从该队列拿出 Method Request, 并执行。

实现 Scheduler,如清单 5 所示:

清单 5. MQ_Scheduler

class MQ_Scheduler { 
public: 
  // Initialize the <Activation_List> and make <MQ_Scheduler> 
  // run in its own thread of control. 
     // we call this thread as Active Object thread. 
  MQ_Scheduler () 
  : act_list_() { 
    // Spawn separate thread to dispatch method requests. 
    // The following call is leveraging the parallelism available on native OS 
    // transparently 
    Thread_Manager::instance ()->spawn (&svc_run,this); 
  } 
  // ... Other constructors/destructors, etc. 
 
  // Put <Method_Request> into <Activation_List>. This 
  // method runs in the thread of its client,i.e. 
  // in the proxy's thread. 
  void insert (Method_Request *mr) { 
    act_list_.insert (mr); 
  } 
 
  // Dispatch the method requests on their servant 
  // in its scheduler's thread of control. 
  virtual void dispatch () { 
    // Iterate continuously in a separate thread(Active Object thread). 
    for (;;) { 
      Activation_List::iterator request; 
      // The iterator's <begin> method blocks 
      // when the <Activation_List> is empty. 
      for(request = act_list_.begin (); request != act_list_.end ();++request){ 
        // Select a method request whose 
        // guard evaluates to true. 
        if ((*request).can_run ()) { 
          // Take <request> off the list. 
          act_list_.remove (*request); 
          (*request).call () ; 
          delete *request; 
        } 
 
        // Other scheduling activities can go here, 
        // e.g., to handle when no <Method_Request>s 
        // in the <Activation_List> have <can_run> 
        // methods that evaluate to true. 
 
      } 
 
    } 
  } 
 
private: 
  // List of pending Method_Requests. 
  Activation_List act_list_; 
 
  // Entry point into the new thread. 
  static void *svc_run (void *arg) { 
    MQ_Scheduler *this_obj =  static_cast<MQ_Scheduler *> (args); 
    this_obj->dispatch (); 
  } 
}; 

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:Active Object 并发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接