package edu.rice.comp322; import edu.rice.hj.api.HjDataDrivenFuture; import edu.rice.hj.runtime.actors.Actor; import edu.rice.hj.runtime.util.Pair; import java.util.Arrays; import java.util.List; import static edu.rice.hj.Module0.launchHabaneroApp; import static edu.rice.hj.Module0.newDDF; import static edu.rice.hj.Module1.asyncAwait; /** *

SyncReplyMain1 class.

* * @author Shams Imam (shams@rice.edu) */ public class Lec29Slide15ReqReplyActor { private static final Object END = new Object(); private static void busyWait(final long time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } /** *

main.

* * @param args an array of {@link String} objects. */ public static void main(final String[] args) { System.out.println("SyncReplyMain1.main starts..."); launchHabaneroApp(() -> { final List workItems = Arrays.asList(1, 2, 3, 4, 5); final ReceiverActor receiverActor = new ReceiverActor(); receiverActor.start(); final SenderActor senderActor = new SenderActor(receiverActor); senderActor.start(); for (Object workItem : workItems) { System.out.println("Sending work item: " + workItem); senderActor.send(workItem); } busyWait(2000); senderActor.send(END); }); System.out.println("SyncReplyMain1.main ends."); } private static class SenderActor extends Actor { private final ReceiverActor receiverActor; private SenderActor(final ReceiverActor receiverActor) { this.receiverActor = receiverActor; } @Override protected void process(final Object theMsg) { if (theMsg == END) { receiverActor.send(END); exit(); return; } if (theMsg instanceof Integer) { System.out.println(" SenderActor: sending " + theMsg); receiverActor.send(Pair.factory((Integer) theMsg, this)); } else { System.out.println(" SenderActor: received " + theMsg); } } } private static class ReceiverActor extends Actor { private ReceiverActor() { super(true); } @Override protected void process(final Object theMsg) { if (theMsg == END) { exit(); return; } @SuppressWarnings("unchecked") final Pair> msgPair = (Pair>) theMsg; final Integer senderMsg = msgPair.left; final Actor sender = msgPair.right; System.out.println(" ReceiverActor: processing " + senderMsg); sender.send(Double.valueOf(senderMsg * senderMsg)); } } }