Guten Abend Zusammen,
Ich arbeite seit einiger Zeit an einem Problem, für welches ich absolut keine Lösung finde. Da ich mit Multithreading noch unerfahren bin. Ich will ein Programm entwerfen, welches für ein Menge von Zahlen z.B 10 - 20 die jeweilige Anzahl von Divisoren errechnet z.B für 11->2 Divisoren(1,11) für 12->6 Divisoren (1,2,3,4,6,12) und das ganze mit n Threads welche asynchrone mit einem newFixedThreadPool und dem ExecutorService sowie dem callable Interface arbeiten. Mir ist aus der Literatur nicht klar geworden wie ich eine n Thread Anwendung am Besten designe, da die meisten Beispiele immer mit 1 oder 2 Threads aufgezeigt werden. Somit meine Frage an euch wie man so etwas am besten lösen kann?,
Ich versuchte bereits einige Dinge aus, der letzte Stand der Dinge habe ich nun dazu gepostet, dieser ist jedoch noch Meilen davon entfernt lauffähig zu sein. Jedoch sollte dieser helfen, das Problem oder die Lösungsrichtung etwas aufzuzeigen.
Es würde mich extremst freuen, wenn ich hilfreiches Feedback erhalten würde.
Besten Dank im voraus.
Ich arbeite seit einiger Zeit an einem Problem, für welches ich absolut keine Lösung finde. Da ich mit Multithreading noch unerfahren bin. Ich will ein Programm entwerfen, welches für ein Menge von Zahlen z.B 10 - 20 die jeweilige Anzahl von Divisoren errechnet z.B für 11->2 Divisoren(1,11) für 12->6 Divisoren (1,2,3,4,6,12) und das ganze mit n Threads welche asynchrone mit einem newFixedThreadPool und dem ExecutorService sowie dem callable Interface arbeiten. Mir ist aus der Literatur nicht klar geworden wie ich eine n Thread Anwendung am Besten designe, da die meisten Beispiele immer mit 1 oder 2 Threads aufgezeigt werden. Somit meine Frage an euch wie man so etwas am besten lösen kann?,
Ich versuchte bereits einige Dinge aus, der letzte Stand der Dinge habe ich nun dazu gepostet, dieser ist jedoch noch Meilen davon entfernt lauffähig zu sein. Jedoch sollte dieser helfen, das Problem oder die Lösungsrichtung etwas aufzuzeigen.
Es würde mich extremst freuen, wenn ich hilfreiches Feedback erhalten würde.
Besten Dank im voraus.
Java:
public class CalculateDivisor {
long von, bis;
int threadCount;
public CalculateDivisor(long von, long bis, int threadCount) {
this.von = von;
this.bis = bis;
this.threadCount = threadCount;
}
public String call() throws Exception {
long countOfDivisor;
/*
/*Berrechnung
/***/
return countOfDivisor;
}
public DvisorResult calculate() throws InterruptedException, ExecutionException {
//Get ExecutorService from Executors utility class, thread pool size is 10
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
//create a list to hold the Future object associated with Callable
List<Future<Long>> list = new ArrayList<Future<Long>>();
//Create MyCallable instance
Callable<String> callable = new MyCallable();
for(long i=von; i< bis; i++){
//submit Callable tasks to be executed by thread pool
Future<String> future = executor.submit(callable);
//add Future to the list, we can get return value using Future
list.add(future);
}
for(Future<Long> fut : list){
try {
//print the return value of Future, notice the output delay in console
// because Future.get() waits for task to get completed
System.out.println(fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
//shut down the executor service now
executor.shutdown();
return new DivisorResult(0, 0);
}
public static void main(String[] args) throws InterruptedException,
ExecutionException {
if (args.length != 3) {
System.out
.println("Usage: CalculateDivisor <intervalStart> <intervalEnd> <threadCount>");
System.exit(1);
}
long von = Long.parseLong(args[0]);
long bis = Long.parseLong(args[1]);
int threads = Integer.parseInt(args[2]);
CalculateDivisor cp = new CalculateDivisor(von, bis, threads);
System.out.println("Ergebnis: " + cp.calculate());
}
}
class DivisorResult {
// das eigentlich ergebnis - die Zahl mit der max. Anzahl von Divisoren
long result;
// Anzahl der Divisoren von Result
long countDiv;
public DivisorResult(long r, long c) {
result = r;
countDiv = c;
}
public long getResult() {
return result;
}
public long getCountDiv() {
return countDiv;
}
@Override
public String toString() {
return "Zahl mit maximaler Anzahl Divisoren: " + result + " ("
+ countDiv + " Divisoren)";
}
}