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.LinkedList; import java.util.List; import java.util.Queue; 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 Lec29Slide15SyncReplyActor { private static final Object END = new Object(); /** *

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); } 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; } final HjDataDrivenFuture responseDDF = newDDF(); pause(); System.out.println(" SenderActor: sending " + theMsg); receiverActor.send(Pair.factory((Integer) theMsg, responseDDF)); asyncAwait(responseDDF, () -> { final Object response = responseDDF.safeGet(); System.out.println(" SenderActor: received " + response); resume(); }); } } 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 HjDataDrivenFuture responseDdf = msgPair.right; System.out.println(" ReceiverActor: processing " + senderMsg); responseDdf.put(Double.valueOf(senderMsg * senderMsg)); } } }