In a multithreaded application, it is typical for threads to lock or wait for a lock. The thread dump can be used for identifying resource contentions. Let's simulate this scenario in our application by modifying the main method of the CourseManagement class to call courseBean.getCourses in separate threads:
public class CourseManagement { public static void main(String[] args) throws IOException { final CourseBean courseBean = new CourseBean(); System.out.println("Type any character to get courses. Type q to quit."); int ch, threadIndex = 0; while ((ch = System.in.read()) != -1) { if (ch != 10 && ch != 13) { //ignore new lines if (ch == 'q') //quit if user types q break; threadIndex++; //used for naming the ...