多生产者、消费者使用
Order类
public class Order {
private String id;//ID
private String name;
private double price;//金额
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Producer类
public class Producer {
private final RingBuffer<Order> ringBuffer;
public Producer(RingBuffer<Order> ringBuffer){
this.ringBuffer=ringBuffer;
}
/**
* onData用来发布事件,每调用一次就发布一次事件
* 它的参数会通过事件传递给消费者
* @param data
*/
public void onData(String data){
//可以把ringBuffer看作是一个事件队列,那么next就是得到下一个事件槽
long sequence = ringBuffer.next();
try {
Order order = ringBuffer.get(sequence);
order.setId(data);
} catch (Exception e) {
e.printStackTrace();
} finally{
//发布事件
ringBuffer.publish(sequence);
}
}
}
Consumer类
public class Consumer implements WorkHandler<Order>{
private String consumerId;
private static AtomicInteger count = new AtomicInteger(0);
public Consumer(String consumerId){
this.consumerId = consumerId;
}
@Override
public void onEvent(Order order) throws Exception {
System.out.println("当前消费者:"+this.consumerId+",消费信息:"+order.getId());
count.incrementAndGet();
}
public int getCount(){
return count.get();
}
}
Main
public class Main {
public static void main(String[] args) throws InterruptedException {
//创建ringBuffer
RingBuffer<Order> ringBuffer =
RingBuffer.create(ProducerType.MULTI,
new EventFactory<Order>() {
@Override
public Order newInstance() {
return new Order();
}
},
1024*1024,
new YieldingWaitStrategy());
SequenceBarrier barrier = ringBuffer.newBarrier();
Consumer[] consumers = new Consumer[3];
for(int i=0;i<consumers.length;i++){
consumers[i]=new Consumer("c"+i);
}
WorkerPool<Order> workerPool =
new WorkerPool<Order>(ringBuffer,
barrier,
new IntEventExceptionHandler(),
consumers);
ringBuffer.addGatingSequences(workerPool.getWorkerSequences());
workerPool.start(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));
final CountDownLatch latch = new CountDownLatch(1);
for(int i=0;i<100;i++){
final Producer p = new Producer(ringBuffer);
new Thread(new Runnable(){
@Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int j=0;j<100;j++){
p.onData(UUID.randomUUID().toString());
}
}
}).start();
}
Thread.sleep(2000);
System.out.println("------------开始生产-------------");
latch.countDown();
Thread.sleep(5000);
System.out.println("总数:"+consumers[0].getCount());
}
static class IntEventExceptionHandler implements ExceptionHandler{
@Override
public void handleEventException(Throwable arg0, long arg1, Object arg2) {}
@Override
public void handleOnShutdownException(Throwable arg0) {}
@Override
public void handleOnStartException(Throwable arg0) {}
}
}