Master-Slave Pattern은 Master가 Slave에게 작업을 분산하고, Slave를 통해서 받은 결과를 통해서 최종 결과를 계산해 내는 패턴이라고 하네요.. 따라서, Master는 작업을 쪼개고, Slaver에게 분배하고, 결과를 계산하는 역할을 할 것이고, Slave는 Master의 작업요청을 처리해서 결과를 리턴하면 되겠네요..
제가 생각하는 내용을 아래의 형태별로 간단하게 코드로 끄적여 봅니다.
예는 1부터 10까지의 factorial을 10개의 Job으로 나누고, 그것을 Master가 더하기를 합니다.
아래의 MSClient는 Client와 Master의 역할을 담당하게 되고, JobThread는 Slave의 역할을 담당합니다.
혹시 코드보시고, 틀렸다고 생각이 되시는 부분이 있으면 답글로 끄적여 주시면 감사하겠습니다.
MSClient.java
JobThread.java
* reference
- http://www.devpia.com/NET2/EvaCast/Lecture/?cu=view&r=105
제가 생각하는 내용을 아래의 형태별로 간단하게 코드로 끄적여 봅니다.
예는 1부터 10까지의 factorial을 10개의 Job으로 나누고, 그것을 Master가 더하기를 합니다.
아래의 MSClient는 Client와 Master의 역할을 담당하게 되고, JobThread는 Slave의 역할을 담당합니다.
혹시 코드보시고, 틀렸다고 생각이 되시는 부분이 있으면 답글로 끄적여 주시면 감사하겠습니다.
MSClient.java
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutionException;
import java.math.BigInteger;
public class MSClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<JobThread> jobArray = new ArrayList<JobThread>();
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 1; i <= 10; i++) {
jobArray.add(new JobThread(i));
}
List<Future<BigInteger>> allResults = null;
long totalSum = 0;
try {
allResults = executor.invokeAll(jobArray);
for(int i=0; i < allResults.size(); i++) {
totalSum += allResults.get(i).get().longValue();
System.out.println((i+1) + "! is " + allResults.get(i).get());
}
System.out.println("Total Value is " + totalSum);
} catch (InterruptedException e) {
System.out.println("Interrupted");
} catch (ExecutionException e) {
System.out.println( "Execution exception");
}
executor.shutdown();
}
}
import java.util.ArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutionException;
import java.math.BigInteger;
public class MSClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<JobThread> jobArray = new ArrayList<JobThread>();
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 1; i <= 10; i++) {
jobArray.add(new JobThread(i));
}
List<Future<BigInteger>> allResults = null;
long totalSum = 0;
try {
allResults = executor.invokeAll(jobArray);
for(int i=0; i < allResults.size(); i++) {
totalSum += allResults.get(i).get().longValue();
System.out.println((i+1) + "! is " + allResults.get(i).get());
}
System.out.println("Total Value is " + totalSum);
} catch (InterruptedException e) {
System.out.println("Interrupted");
} catch (ExecutionException e) {
System.out.println( "Execution exception");
}
executor.shutdown();
}
}
JobThread.java
import java.util.concurrent.Callable;
import java.math.BigInteger;
public class JobThread implements Callable<BigInteger> {
//
private int min = 1;
//
private int value = 0;
public JobThread(int value) {
this.value = value;
}
@Override
public BigInteger call() throws Exception {
BigInteger fac = BigInteger.valueOf(this.min);
for (int i = 1; i <= this.value; i++)
fac = fac.multiply(BigInteger.valueOf(i));
return fac;
}
}
import java.math.BigInteger;
public class JobThread implements Callable<BigInteger> {
//
private int min = 1;
//
private int value = 0;
public JobThread(int value) {
this.value = value;
}
@Override
public BigInteger call() throws Exception {
BigInteger fac = BigInteger.valueOf(this.min);
for (int i = 1; i <= this.value; i++)
fac = fac.multiply(BigInteger.valueOf(i));
return fac;
}
}
* reference
- http://www.devpia.com/NET2/EvaCast/Lecture/?cu=view&r=105
'Ooad' 카테고리의 다른 글
| 단순 Reactor 패턴의 성능향상 방안.. (0) | 2009/06/25 |
|---|---|
| DI(Dependency Injection)에 대해서.. (0) | 2009/06/25 |
| POSA 1 - Master-Slave Pattern (0) | 2009/06/18 |
| POSA 1 - Whole-Part Pattern (0) | 2009/06/16 |
| POSA 1 - Presentation Abstraction Control Pattern (0) | 2009/06/15 |