JThreadSpy: Teaching Multithreading Programming by Analyzing Execution Traces