import java.io.*; import java.net.*; public class ThreadedNewsSearch { public static void main(String[] args) throws Exception { String query = args[0]; final String[] sites = new String[] { "http://www.cnn.com", "http://news.bbc.co.uk", "http://www.nytimes.com", "http://www.slashdot.org" }; final String[] contents = new String[sites.length]; // Fetch pages concurrently with multiple threads Thread[] threads = new Thread[sites.length]; for (int i = 0; i < sites.length; i++) { final int ii = i; threads[i] = new Thread(new Runnable() { public void run() { System.out.println("Thread " + ii + " started"); contents[ii] = fetchContent(sites[ii]); System.out.println("Thread " + ii + " finished"); } }); threads[i].start(); } // Wait for all the threads to finish for (int i = 0; i < sites.length; i++) threads[i].join(); // Count up results System.out.println("Counting up results..."); int totalFound = 0; for (int i = 0; i < sites.length; i++) { if (contents[i].indexOf(query) != -1) { System.out.println("Found " + query + " on " + sites[i]); totalFound++; } } System.out.println(totalFound + " of " + sites.length + " news sites mentioned " + query); } public static String fetchContent(String site) { try { System.out.println("Fetching " + site + "..."); URL url = new URL(site); InputStreamReader in = new InputStreamReader(url.openStream()); String content = ""; char[] buffer = new char[4096]; int numRead; while ((numRead = in.read(buffer)) != -1) { System.out.println("Read " + numRead + " bytes from " + site); content += new String(buffer, 0, numRead); } System.out.println("Finished fetching " + site); return content; } catch (Exception e) { e.printStackTrace(); System.exit(1); return null; } } }