/*************************************************** Course 01252 Concurrent Systems Possible solution for point 4. of cplab2 HHL 09-09-2004 rev. 10-09-2007 ****************************************************/ import java.util.*; import java.io.*; class Searcher extends Thread { char[] text, pattern; int from = 0, to = 0; // Search the sub-string text[from..(to-1)] Vector result; // Local result public Searcher(char[] txt, char[] p, int f, int t) { text = txt; pattern = p; from = f; to = t; result = new Vector(); } public Vector getResult() { return result; } public void run() { final int pl = pattern.length; // VERY naive string matching to consume some CPU-cycles for (int i = from ; i <= to - pl; i++) { boolean eq = true; for (int j= 0; j < pl; j++) { if (text[i+j] != pattern[j]) eq = false; // We should break here } if (eq) result.add(i); } } } public class ParSearch { static final int max = 10000000; // Max no. of chars searched static char[] text = new char[max]; // (part of) file to be searched static int tl; // Length of actual text static char[] pattern; // Search pattern static int n = 1; // No. of threads to use static String datafile; // Name of data file static void getParameters(String[] argv) { // Reads parameters into static variables // No need to modify try { String fname = argv[0]; pattern = argv[1].toCharArray(); if (argv.length > 2) { n = new Integer(argv[2]).intValue(); } if (argv.length > 3) { datafile = argv[3]; } InputStreamReader file = new InputStreamReader(new FileInputStream(fname)); tl = file.read(text); if (file.read() >=0) System.out.println("\nWarning: file truncated to "+ max+" characters\n"); if (n <= 0 || pattern.length < 1 || pattern.length > tl/n) throw new Exception(); } catch (Exception e) { System.out.println( "\n"+ " Usage: java Search file pattern [threads] \n"+ " 0 < threads \n"+ " 0 < size(pattern) <= size(file)/threads \n"); System.exit(1); } } static public boolean check(int pos) { // Check that pattern does occur at pos try{ for (int j= 0; j < pattern.length; j++) { if (text[pos+j] != pattern[j]) return false; } return true; } catch (Exception e) {return false;} } public static void main(String[] argv) { try { getParameters(argv); final int pl = pattern.length; Searcher[] s = new Searcher[n]; final int sectl = tl/n; long start = System.currentTimeMillis(); // Create threads with properly overlapping search sections for (int i = 0; i < n-1; i++) { s[i] = new Searcher(text,pattern,i*sectl,(i+1)*(sectl)+pl-1); } s[n-1] = new Searcher(text,pattern,(n-1)*sectl,tl); // Run threads concurrently and await termination for (int i = 0; i < n; i++) s[i].start(); for (int i = 0; i < n; i++) try { s[i].join();} catch (InterruptedException ie){}; long time = System.currentTimeMillis()-start; int total = 0; for (int i = 0; i < n; i++) { total = total + s[i].getResult().size(); } System.out.println("\n" + total + " occurrences of Pattern \"" + new String(pattern) + "\"" ); for (int i = 0; i < n; i++) { for (int pos : s[i].getResult()) { // System.out.print(" "+ pos); if (!check(pos)) { System.out.print("\n ERROR: Pattern not found at " + pos + "!!\n"); } } } System.out.println("\n\nin "+time+" milliseconds\n"); if (datafile != null) { // Append result to data file FileWriter f = new FileWriter(datafile,true); PrintWriter data = new PrintWriter(new BufferedWriter(f)); data.println(n + " " + time); data.close(); } } catch (Exception e) { System.out.println("Search: "+e);} } }