public class App {
private Aggregator aggregator; private Task[] tasks;
public static void main(String[] args) { int allTask = Integer.parseInt(args[0]); long start; long end;
App app1 = new App(allTask); start = System.currentTimeMillis(); app1.calc("Single"); end = System.currentTimeMillis(); System.out.println(end - start);
App app2 = new App(allTask); start = System.currentTimeMillis(); app2.calc("Multi"); end = System.currentTimeMillis(); System.out.println(end - start); }
public App(int allTask) { aggregator = new Aggregator(allTask);
tasks = new Task[allTask]; for(int i=0; i<allTask; i++) { tasks[i] = new Task(i,aggregator); } }
public void calc(String threadMode) { for(int i=0; i<tasks.length; i++) {
//System.out.println("Start Processing...");
if(threadMode.equals("Single")) { tasks[i].processBySingleThread(); } else { tasks[i].processByMultiThread(); }
//System.out.println("End Processing..."); }
System.out.println( "========== Final Value :" + aggregator.getAggregatedValue()); }
}
public class Task extends Thread {
private int value; private Aggregator aggregator;
public Task(int v,Aggregator a) { value = v; aggregator = a; }
public int getValue() { return value; }
public void processBySingleThread() { process(); }
public void processByMultiThread() { start(); }
public void run() { process(); }
private void process() {
System.out.println("Now Processing...");
try { sleep(500); } catch(Exception e) { e.printStackTrace(); }
aggregator.add(this); }
}
public class Aggregator {
private int aggregatedValue
;
private int finishedTask; private int allTask;
public Aggregator(int i) { aggregatedValue = 0; finishedTask = 0; allTask = i; }
public synchronized void add(Task task) { aggregatedValue += task.getValue(); finishedTask++; System.out.println(aggregatedValue); }
public int getAggregatedValue() { while(finishedTask < allTask) { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } }
return aggregatedValue; }
}