the queue implementation,
// e.g., an array or a linked list, go here.
};
Active Object并发模式在Java中的应用(5)
时间:2011-10-22 IBM 李三红
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 ();
}
};
Active Object并发模式在Java中的应用(6)
时间:2011-10-22 IBM 李三 |