import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Shell { static List>> read(String filename) { ArrayList> A = new ArrayList>(); ArrayList> B = new ArrayList>(); String thisLine; try { BufferedReader br = new BufferedReader(new FileReader(filename)); // Begin reading A while ((thisLine = br.readLine()) != null) { if (thisLine.trim().equals("")) { break; } else { ArrayList line = new ArrayList(); String[] lineArray = thisLine.split("\t"); for (String number : lineArray) { line.add(Integer.parseInt(number)); } A.add(line); } } // Begin reading B while ((thisLine = br.readLine()) != null) { ArrayList line = new ArrayList(); String[] lineArray = thisLine.split("\t"); for (String number : lineArray) { line.add(Integer.parseInt(number)); } B.add(line); } br.close(); } catch (IOException e) { System.err.println("Error: " + e); } List>> res = new LinkedList>>(); res.add(A); res.add(B); return res; } static void printMatrix(int[][] matrix) { for (int[] line : matrix) { int i = 0; StringBuilder sb = new StringBuilder(matrix.length); for (int number : line) { if (i != 0) { sb.append("\t"); } else { i++; } sb.append(number); } System.out.println(sb.toString()); } } public static int[][] parallelMult(ArrayList> A, ArrayList> B, int threadNumber) { int[][] C = new int[A.size()][B.get(0).size()]; ExecutorService executor = Executors.newFixedThreadPool(threadNumber); List> list = new ArrayList>(); int part = A.size() / threadNumber; if (part < 1) { part = 1; } for (int i = 0; i < A.size(); i += part) { System.err.println(i); Callable worker = new LineMultiplier(A, B, i, i+part); Future submit = executor.submit(worker); list.add(submit); } // now retrieve the result int start = 0; int CF[][]; for (Future future : list) { try { CF = future.get(); for (int i=start; i < start+part; i += 1) { C[i] = CF[i]; } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } start+=part; } executor.shutdown(); return C; } public static void main(String[] args) { String filename; int cores = Runtime.getRuntime().availableProcessors(); System.err.println("Number of cores:\t" + cores); int threads; if (args.length < 3) { filename = "3.in"; threads = cores; } else { filename = args[1]; threads = Integer.parseInt(args[2]); } List>> matrices = read(filename); ArrayList> A = matrices.get(0); ArrayList> B = matrices.get(1); int[][] C = parallelMult(A, B, threads); printMatrix(C); } }