androidserver's Introduction
1. Design approach My goal was to solve the problem with a minimum of classes and LoC. Two actors immediately suggested themselves - Arbiter and Smoker. I could have gone down two paths: have the smokers poll the Arbiter for supplies, or have the Arbiter tell the Smokers what supplies were available. I chose to have the Arbiter contact the Senders. The Arbiter would need to send messages to the senders to indicate ingredient availability ("on the table") and to tell them to shut down. The Smokers would just need to, well, smoke. 2. Design elements A smoker's ingredients are stored as an Byte, where: 4 bit = Tobacco 2 bit = Paper 1 bit = Matches I made this design decision because I felt like it, and I thought I might be able to work some bitshifts into this project, and bitshifts are always fun. Main.java: Main creates and starts the Smokers and Arbiter. To support that end, Main includes UntypedActorFactories since Smoker and Arbiter use non-default constructors. I prefer using non-default constructors rather than setter methods for things like telling the Arbiter what smokers are at the table because this way I know that once I have a started ActorRef, I'm good to go. Main also includes simple classes Acknowledgement and Pill, which are used as messages. Professor, this is because of your insistence on us using the default package! Pill is sent from Arbiter to Smoker; Acknowledgement is sent from Smoker to Arbiter. I would prefer to have defined these small classes in Arbiter, but since we are developing in the default package, Smoker would then not be able to import Acknowledgement from Arbiter (we can only import classes from Main inside the default package). Cool line: for (int i = 0; i <= 2; i++) { smokers.add(actorOf(new SmokerFactory((Byte)1 << i)).start()); } Since ingredients are stored as integers, this creates 3 smokers, one each with tobacco, paper, and matches. Smoker.java: This class merely accepts messages (containing ingredients) from the Arbiter. It either returns immediately, or after using the ingredients to roll & smoke a cigarette. I used preStart() to print out what ingredient the Smoker has to begin with, because I didn't want to muck up some of my cute little one-liners with it. A Smoker can roll a cigarette when: (Byte)message + ingredient == Integer.parseInt("111", 2); Or, in other words, when the sum of the Smoker's ingredient (010) and the two ingredients the Arbiter has put on the table (101) equals 7. Note: Simulated smokers smoke EXTREMELY quickly. Arbiter.java: In this class, instead of using Main to send Arbiter the first message, I have Arbiter send itself a message (from preStart()) with the first ingredients to lay down. Arbiter also stops itself once nCount iterations have passed (at which point it passes a pill to the Smokers). Ingredients are passed to Smokers; the Arbiter collects all three Futures as a sequence and waits for all 3 Smokers to respond. Cool line: private Byte nextIngredients() { return new Byte[] {3,5,6}[new Random().nextInt(3)]; } 3. Issues I faced two issues during implementation. The first issue is that I am using Akka 1.2, and most documentation (of which there is little) is aimed at Akka 2.0. The second issue was my syntax for responding to a message from Arbiter within Smoker. I tried to use getContext().getSender().get().tell(message), and could not figure out why I was getting a large number of NoSuchElementExceptions. I ultimately altered getSender() to getSenderFuture(), which worked like a charm. I never found out WHY those NoSuchElementExceptions were generated, which I found to be an imminently satisfatory outcome for Week 10.
androidserver's People
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.