Extracting static and dynamic structural information from Java concurrent programs for coverage testing