2012-05-08 11 views
6

Mam program, który wykonuje długotrwałe obliczenia, więc chcę przyspieszyć jego działanie. Tak więc próbowałem uruchomić 3 wątki w tej chwili, ale java.exe nadal zajmuje 25% użycia procesora (więc używany jest tylko jeden procesor), a to pozostaje, nawet jeśli spróbuję użyć .setPriority(Thread.MAX_PRIORITY); i ustawić priorytet java.exe w czasie rzeczywistym (24) . Próbowałem użyć RealtimeThread, ale wydaje się, że działa jeszcze wolniej. Byłoby idealnie, gdyby każdy wątek był przydzielony do jednego procesora, a całkowite użycie procesora wzrosło do 75%, ale nie wiem, jak to zrobić. I tak wygląda teraz mój kod:Dlaczego mój program gwintowany wykorzystuje tylko jeden procesor?

Thread g1 = new MyThread(i,j); 
g1.setPriority(Thread.MAX_PRIORITY); 
g1.run(); 
Thread g2 = new MyThread(j,i); 
g2.setPriority(Thread.MAX_PRIORITY); 
g2.run(); 
Thread g3 = new MyThread(i,j); 
g3.setPriority(Thread.MAX_PRIORITY); 
g3.run(); 
if (g1.isAlive()) { 
     g1.join(); 
} 
if (g2.isAlive()) { 
     g2.join(); 
} 
if (g3.isAlive()) { 
     g3.join(); 
} 
+2

Użyj '.start()' jak wskazali inni - a następnie * prawdopodobnie * chcesz opuścić planowanie do harmonogramu, zamiast samemu grać priorytetami. Jeśli nie wiesz * całkiem * wiele o planowaniu wątków, szanse na wykonanie pracy harmonogramu lepiej niż to jest niewielkie (w najlepszym wypadku). –

+0

możliwy duplikat metod [java thread - run() i start()] (http://stackoverflow.com/questions/3027495/java-thread-run-and-start-methods) –

Odpowiedz

23

W rzeczywistości nie używasz wątków.

Należy zadzwonić pod numer .start(), a nie .run().

11

Nie ma to nic wspólnego z procesorami - w rzeczywistości nie uruchamiasz 3 wątków, wszystko uruchamiasz w głównym wątku. Aby rozpocząć wątek, wywołaj jego metodę start(), a nie run().

6

Po pierwsze, jak sugerują inni, tak naprawdę nie używasz wielu wątków. Dzieje się tak, ponieważ wywołujesz metodę run(), która kończy się wykonywaniem pracy w wątku wywołującym.

Teraz, aby odpowiedzieć na resztę pytania, które biorę pod uwagę, w jaki sposób można zmaksymalizować wydajność procesu wielowątkowego. To nie jest proste pytanie, ale dam ci podstawy. (Inne, zachęcamy do dzwonienia.)

Najlepszym sposobem na maksymalizację wydajności procesu jest próba zmuszenia wszystkich wątków do wykonania tej samej pracy i uniknięcia blokowania. Oznacza to, że Twoim zadaniem jest "zbalansować" obciążenie pracą, aby aplikacja działała sprawnie.

Ogólnie nie można przypisać wątku do uruchomienia na określonym rdzeniu procesora; zwykle jest to zadanie systemu operacyjnego i samych procesorów. System operacyjny planuje proces (korzystając z podanych priorytetów), a procesory mogą tworzyć własne harmonogramy na poziomie instrukcji. Poza ustawianiem priorytetów, pozostała część harmonogramu jest całkowicie poza twoją kontrolą.

EDYCJA: Jestem uzależniony od średników.