| InterferingConcurrentShuttleAnimations.java |
package lectures.animation.threads.synchronized_methods;
import util.annotations.WebDocuments;
import lectures.animation.threads_commands.AShuttleAnimator;
import lectures.animation.threads_commands.ConcurrentShuttleLaunchAnimation;
import lectures.animation.threads_commands.ShuttleAnimator;
import lectures.animation.threads_commands.extra.ThreadSupport;
import lectures.composite.objects_shapes.PlottedShuttle;
import lectures.mvc.properties.AnObservablePlottedShuttle;
import bus.uigen.OEFrame;
import bus.uigen.ObjectEditor;
/**
* THREADS CHANGING THE SAME OBJECT CONCURRENTLY
* In a previous example, we had two shuttles, two animators, and two threads,
* which operated independently. Now we have one shuttle, one animator,
* and two threads. Thus, we have two threads changing the same object concurrently.
*
* Run the program without break points (execute run rather than debug-run).
* See the behavior on the screen.
*
*
* (T/F) In InterferingConcurrentShuttleAnimations, the two animators run serially,
* that is, the first animation completes before the second one starts.
*
*/
@WebDocuments({"Lectures/AnimationThreadsSynchronizedMethods.pptx", "Lectures/AnimationThreadsSynchronizedMethods.pdf", "Videos/AnimationThreadsSynchronizedMethods.avi"})
public class InterferingConcurrentShuttleAnimations extends ConcurrentShuttleLaunchAnimation {
static final long SECOND_THREAD_DELAY = 500;
public static void main(String[] args) {
PlottedShuttle shuttle1 = new AnObservablePlottedShuttle(SHUTTLE1_X, SHUTTLE1_Y);
displayShuttleFrame(shuttle1);
ShuttleAnimator aShuttleAnimator = new AShuttleAnimator();
concurrentDemoShuttleAnimation(aShuttleAnimator, shuttle1);
/*
* Comment the sleep out when asked.
*/
ThreadSupport.sleep(SECOND_THREAD_DELAY); // start the second thread a little after the first one
concurrentDemoShuttleAnimation(aShuttleAnimator, shuttle1);
}
}
/**
* Look at the main method carefully. Recall that concurrentDemoShuttleAnimation
* creates a new thread in which its animator argument animates the shuttle
* argument.
*
*
* (T/F) The main method delays the creation of the second animating thread.
*
* Your next task is to understand the order of animations through the console
* output. Look at the messages with text "started animating".
*
* (T/F) Thread Shuttle Animation 1 starts animating in the Y direction
* before thread Shuttle Animation 2.
*
* (T/F) Thread Shuttle Animation 1 starts animating in the X direction
* before thread Shuttle Animation 2.
*
* (T/F) The second thread finishes animating in the Y direction after
* the first first thread finishes animating in the Y direction.
*
* (T/F) The second thread finishes animating in the X direction after
* the first thread finishes animating in the X direction.
*
* Your next task is to answer a series of questions to understand the
* animation behavior and the console output.
*
* Try to understand the console output giving values of saved X and saved Y.
*
* To do so, you need to go to the class in which the prints occur, AShuttleAnimator.
*
* Go to that class, study the code carefully, see which variables are printed
* by the print statements and how these variables are used in the animations.
*
* (T/F) The "saved X" print statement prints the value of the curX and curY
* variables in animateFromOrigin().
*
* (T/F) The orginalX variable holds the final X position of the shuttle after the
* animation finishes.
*
* (T/F) The curX variable is initialized with the starting X position of the animation.
*
* (T/F) The originalX variable is an instance variable of AShuttleAnimator.
*
* (T/F) The curX variable is an instance variable of AShuttleAnimator.
*
* (T/F) originalX is changed multiple times during an execution of
* animateFromOrigin().
*
* (T/F) The two threads access the same copy of originalX and changes made by
* one thread to the variable can be seen by the other thread.
*
*
* (T/F) animateFromOrigin() sets the value of the ShuttleX and ShuttleY properties of
* the shuttle to 0 at the start of the animation.
*
* (T/F) animateYFromOrigin sets the value of the ShuttleX property during the animation.
*
* (T/F) animateYFromOrigin sets the value of the ShuttleY property during the animation.
*
*
* Look at the two values of originalX and originalY printed by the two threads
* on the console.
*
* (T/F) originalX is the same value when printed in both threads.
*
* (T/F) originalY is the same value when printed in both threads.
*
* To answer the following questions, you might want to print the values of
* startX and startY and the current thread with a print of the form:
*
* System.out.println ("Thread "+ Thread.currentThread()+ " x :" + startX);
*
* (I should have created additional variables rather than changing startX
* and startY in the loop- I did so to save space in the PPT.)
*
* The prints will clutter the output, so try and first answer questions without
* printing.
*
* (T/F) Changes made by Shuttle Animation 1 to the ShuttleX property influence the
* value of originalX in Shuttle Animation 2.
*
* (T/F) Changes made by Shuttle Animation 1 to the ShuttleY property influence the
* value of originalY in Shuttle Animation 2.
*
* (T/F) The end position of the second animation is not the same as the end position
* of the first animation.
*
* (T/F) The loop in animateYFromOrigin() is executed at least once by the
* first thread.
*
* (T/F) The loop in animateXFromOrigin() is executed at least once by the
* first thread.
*
* (T/F) The loop in animateYFromOrigin() is executed at least once by the
* second thread.
*
* (T/F) The loop in animateXFromOrigin() is executed at least once by the
* second thread
*
*
* Now comment out the sleep and observe the values of saved X and saved Y on
* the console and run the program and observe the animations and the output.
*
* (T/F) Removing the inter-thread delay makes no difference to the "saved X"
* and "saved Y" outputs.
*
* (T/F) After removing the inter-thread delay, the loop in animateYFromOrigin()
* is executed at least once by the first thread.
*
* (T/F) After removing the inter-thread delay, the loop in animateXFromOrigin()
* is executed at least once by the first thread.
*
* (T/F) After removing the inter-thread delay, the loop in animateYFromOrigin()
* is executed at least once by the second thread.
*
* (T/F) After removing the inter-thread delay, the loop in animateXFromOrigin()
* is executed at least once by the second thread.
*
* (T/F) After removing the delay, the two animators run serially,
* that is, the first animation completes before the second one starts.
*
* Comment out these statements in AShuttleAnimator:
* int originalX = shuttle.getShuttleX();
* int originalY = shuttle.getShuttleY();
*
* and instead put in:
*
* int originalX = 50;
* int originalY = 100;
*
*
* (T/F) After setting originalX and originalY to predetermined values,
* both animations execute the X loop at least once.
*
* (T/F) After setting originalX and originalY to predetermined values,
* both animations execute the Y loop at least once.
*
* Next class: SynchronizedConcurrentShuttleAnimations
*
*
*
*/