使用Java5+GPar来控制事件的处理

1 view
Skip to first unread message

foxgem

unread,
Dec 16, 2009, 1:06:20 AM12/16/09
to groovy-xa
 
作者的这篇文章起源于这样一个问题:“在一个持续产生事件的系统中,如何保证在固定时间(如15秒)内只处理1个事件”。作者以经典的“睡觉的理发师”为例给出了他的做法,解法分两部分:
1。事件处理
    class Customer {
     String name
    }
    
    // waiting room can't hold more than 12!
    def waitingRoom = new ArrayBlockingQueue(12)  <==jdk5中对象,取元素时,有则立刻返回;否则,等待
    
    def barber = Executors.newScheduledThreadPool(1)  <==jdk5中对象
    barber.scheduleAtFixedRate({
         println 'Barber: Next customer please!'
         Customer customer = waitingRoom.take()
         println "${customer.name} gets a haircut at ${new Date().format('H:m:s')}"
     } as Runnable, 0, 15, TimeUnit.MINUTES)
 
2。产生事件
    def barberShop = new PooledActorGroup().reactor {message ->  <==使用GPar完成
     switch (message) {
         case Enter:
             println "${message.customer.name} waits for a haircut..."
             waitingRoom.add(message.customer)
             break
     }
    }
   
    class Enter {
     Customer customer
    }
   
    barberShop << new Enter(customer: new Customer(name: 'Jerry'))
    barberShop << new Enter(customer: new Customer(name: 'Phil'))
    barberShop << new Enter(customer: new Customer(name: 'Bob'))
    barberShop << new Enter(customer: new Customer(name: 'Ron'))
Reply all
Reply to author
Forward
0 new messages