Sie können die Anzahl der Prozesse bestimmen, die für die Java Virtual Machine verfügbar sind, indem Sie die statische Runtime-Methode availableProcessors verwenden . Wenn Sie die Anzahl der verfügbaren Prozessoren festgelegt haben, erstellen Sie diese Anzahl von Threads und teilen Sie Ihre Arbeit entsprechend auf.
Update : Zur weiteren Verdeutlichung ist ein Thread nur ein Objekt in Java, sodass Sie ihn wie jedes andere Objekt erstellen können. Nehmen wir also an, Sie rufen die obige Methode auf und stellen fest, dass sie 2 Prozessoren zurückgibt. Genial. Jetzt können Sie eine Schleife erstellen, die einen neuen Thread generiert, die Arbeit für diesen Thread aufteilt und den Thread auslöst. Hier ist ein Pseudocode, um zu demonstrieren, was ich meine:
int processors = Runtime.getRuntime().availableProcessors();
for(int i=0; i < processors; i++) {
Thread yourThread = new AThreadYouCreated();
// You may need to pass in parameters depending on what work you are doing and how you setup your thread.
yourThread.start();
}
Weitere Informationen zum Erstellen eines eigenen Threads finden Sie in diesem Tutorial . Möglicherweise möchten Sie auch Thread-Pooling für die Erstellung der Threads betrachten.
Sie möchten sich wahrscheinlich auch das java.util.concurrent-Framework für dieses Zeug ansehen. Etwas wie:
oder
Dies ist viel schöner als die Bewältigung Ihrer eigenen Thread-Pools usw.
quelle
Option 1:
newWorkStealingPool von
Executors
Mit dieser API müssen Sie nicht die Anzahl der Kerne übergeben
ExecutorService
.Implementierung dieser API aus Grepcode
Option 2:
newFixedThreadPool API von
Executors
oderother newXXX constructors
, die zurückgibtExecutorService
Ersetzen Sie nThreads durch
Runtime.getRuntime().availableProcessors()
Option 3:
ThreadPoolExecutor
geben
Runtime.getRuntime().availableProcessors()
als Parameter anmaximumPoolSize
.quelle
Doug Lea (Autor des gleichzeitigen Pakets) hat dieses Dokument, das möglicherweise relevant ist: http://gee.cs.oswego.edu/dl/papers/fj.pdf
Das Fork Join-Framework wurde zu Java SE 7 hinzugefügt. Nachfolgend einige weitere Referenzen:
http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html Artikel von Brian Goetz
http://www.oracle.com/technetwork/articles/java/fork-join-422606.html
quelle
Der Standardweg ist die Methode Runtime.getRuntime (). AvailableProcessors (). Bei den meisten Standard-CPUs haben Sie hier die optimale Thread-Anzahl (die nicht die tatsächliche CPU-Kernanzahl ist) zurückgegeben. Deshalb ist dies das, wonach Sie suchen.
Beispiel:
Vergessen Sie NICHT, den Executor-Dienst wie folgt herunterzufahren (sonst wird Ihr Programm nicht beendet):
Hier nur eine kurze Übersicht über das Einrichten eines zukunftsbasierten MT-Codes (zur Veranschaulichung offtopic):
Dann müssen Sie verfolgen, wie viele Ergebnisse Sie erwarten, und diese wie folgt abrufen:
quelle
In der Runtime-Klasse gibt es eine Methode namens availableProcessors (). Damit können Sie herausfinden, wie viele CPUs Sie haben. Da Ihr Programm CPU-gebunden ist, möchten Sie wahrscheinlich (höchstens) einen Thread pro verfügbarer CPU haben.
quelle