package edu.rice.comp322; import edu.rice.hj.runtime.actors.Actor; import static edu.rice.hj.Module0.finish; import static edu.rice.hj.Module0.launchHabaneroApp; /** *

ThreadRingMain class.

* * @author Shams Imam (shams@rice.edu) Created: Mar/08/12 8:29 PM */ public class Lec29Slide2ThreadRing { /** *

main.

* * @param args an array of {@link String} objects. */ public static void main(final String[] args) { final int numThreads = 4; final int numberOfHops = 10; launchHabaneroApp(() -> { final ThreadRingActor[] ring = new ThreadRingActor[numThreads]; finish(() -> { for (int i = numThreads - 1; i >= 0; i--) { ring[i] = new ThreadRingActor(i); ring[i].start(); if (i < numThreads - 1) { ring[i].nextActor(ring[i + 1]); } } ring[numThreads - 1].nextActor(ring[0]); ring[0].send(numberOfHops); }); System.out.println("Thread ring actors terminated."); }); } private static class ThreadRingActor extends Actor { private Actor nextActor; private final int id; ThreadRingActor(int id) { this.id = id; } public void nextActor(Actor nextActor) { this.nextActor = nextActor; } @Override protected void process(final Object theMsg) { if (theMsg instanceof Integer) { Integer n = (Integer) theMsg; if (n > 0) { System.out.println("Thread-" + id + " got token, remaining = " + n); nextActor.send(n - 1); } else { System.out.println("Terminating Thread-" + id); nextActor.send(-1); exit(); } } else { /* ERROR - handle appropriately */ } } } }