Difference between revisions of "Iced Cakes Pipeline"

From CSE231 Wiki
Jump to navigation Jump to search
Line 20: Line 20:
 
: [http://www.cse.wustl.edu/~cosgroved/courses/cse231/s18/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html#awaitAdvanceForPhase-java.util.concurrent.Phaser-int- awaitAdvanceForPhase]
 
: [http://www.cse.wustl.edu/~cosgroved/courses/cse231/s18/apidocs/edu/wustl/cse231s/concurrent/PhaserUtils.html#awaitAdvanceForPhase-java.util.concurrent.Phaser-int- awaitAdvanceForPhase]
  
If you are on or past the phase you want to await, then calling <code>phaser.awaitAdvance()</code> directly is fine.  If you might be on a prior phase, then invoke <code>PhaserUtils.awaitAdvanceForPhase(phaser, phase)</code>.  If in doubt, invoking awaitAdvanceForPhase is fine.
+
If you are on or past the phase you want to await, then calling <code>phaser.awaitAdvance()</code> directly is fine.  If you might be on a prior phase, then invoke <code>PhaserUtils.awaitAdvanceForPhase(phaser, phase)</code>.  If in doubt, invoking awaitAdvanceForPhase is safer.
  
 
  <nowiki> public static int awaitAdvanceForPhase(Phaser phaser, int phase) {
 
  <nowiki> public static int awaitAdvanceForPhase(Phaser phaser, int phase) {

Revision as of 15:24, 11 April 2018

Motivation

Pipelines can increase throughput when processing a stream of data. We will gain additional experience with Phasers by building a software pipeline.

Backgroud

Code To Use

Cakes

Looping

Java For Loop

Phasers

class Phaser (Guide to the Java Phaser)

register
arrive
awaitAdvance use via PhaserUtils.awaitAdvanceForPhase(phaser, phase)

PhaserUtils

awaitAdvanceForPhase

If you are on or past the phase you want to await, then calling phaser.awaitAdvance() directly is fine. If you might be on a prior phase, then invoke PhaserUtils.awaitAdvanceForPhase(phaser, phase). If in doubt, invoking awaitAdvanceForPhase is safer.

	public static int awaitAdvanceForPhase(Phaser phaser, int phase) {
		return awaitAdvanceForPhase(phaser, phase, () -> Thread.yield());
	}

	public static int awaitAdvanceForPhase(Phaser phaser, int phase, Runnable runnable) {
		while (true) {
			int currentPhase = phaser.awaitAdvance(phase);
			if (currentPhase < 0 || currentPhase > phase) {
				return currentPhase;
			} else {
				if (runnable != null) {
					runnable.run();
				}
			}
		}
	}

Questions To Ask Yourself

  1. What are my tasks?
  2. What work does each task need to do?
  3. What, if anything, does each task depend upon? That is: what does each task have to wait for before it may proceed?

Code To Implement

class: CakePipeline.java Java.png
methods: mixBakeAndIceCakes
package: pipeline.cake.studio
source folder: student/src/main/java

method: public static IcedCake[] mixBakeAndIceCakes(Mixer mixer, Baker baker, Icer icer, int cakeCount) Parallel.svg (parallel implementation required)

Testing Your Solution

Visualization

class: CakePipelineVizApp.java VIZ
package: pipeline.cake.viz
source folder: student/src//java

CakePipelineScreenShot.png


Correctness

class: CakePipelineTestSuite.java Junit.png
package: pipeline.cake.studio
source folder: testing/src/test/java

When you are passing the tests and your visualization looks good, demo it to an instructor.