Ahh. An interesting point with worthwhile lessons learned. The first lesson might be to use a profiler or debugger more often. Thanks for pointing out the value of those tools. The second is detailed below:
While there is not explicit recursion, there is recursion-like behavior in that Object1 calls Object2 and then waits for Object2 to notify Object1 that it's done, a ping-pong like behavior, but the entry or return point to Object1 is different than the exit point. In an effort to show the action between the two classes with print statements, I left loose ends that will probably come back as errors, probably StackOverflow errors, but I never ran it long enough to confirm.
The code as posted includes at least two print statements AFTER the call from objectX to objectY. As in recursion, I expect the return to those print statements are pushed to the stack to be executed someday, but in this program that someday never comes. There's no return, no unwinding as there would be in properly coded recursion. The solution that rids the code of this nuisance is to simply move all print statements to occur before the call to the next object.
Again, thanks for the lesson.