bookmark / 言語 / Java / マルチスレッドでの集約


bookmark / 言語 / Java / マルチスレッドでの集約

App

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());
	}

}

Task

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);
	}

}

Aggregator

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;
	}

}