2012-05-08 13 views
6

Ho un programma che esegue calcoli a lungo termine, quindi voglio accelerare le sue prestazioni. Così ho provato a lanciare 3 thread al momento, ma il java.exe occupa ancora il 25% dell'utilizzo della CPU (quindi, viene utilizzata solo una CPU), e rimane anche se provo a usare .setPriority(Thread.MAX_PRIORITY); e impostare la priorità di java.exe in tempo reale (24) . Ho provato a usare RealtimeThread ma sembra che funzioni ancora più lentamente. Sarebbe perfetto se ogni thread fosse assegnato a un processore e l'utilizzo totale della CPU fosse aumentato al 75%, ma non so come farlo. Ed ecco come appare il mio codice adesso:Perché il mio programma threaded utilizza solo una CPU?

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

Usa '.start()' come altri hanno sottolineato - e quindi tu * probabilmente * vuoi lasciare la programmazione allo scheduler invece di giocare con priorità tu stesso. A meno che tu non sappia * abbastanza * molto sulla programmazione dei thread, le possibilità di fare il lavoro del programmatore meglio di quanto non siano sottili (nella migliore delle ipotesi). –

+0

possibile duplicato di [java thread - metodi run() e start()] (http://stackoverflow.com/questions/3027495/java-thread-run-and-start-methods) –

risposta

23

In realtà non si stanno utilizzando thread.

È necessario chiamare .start(), non .run().

11

Questo non ha nulla a che fare con le CPU: in realtà non si stanno avviando 3 thread, si sta eseguendo tutto sul thread principale. Per avviare una discussione, chiama il suo metodo start(), non run().

6

In primo luogo, come suggeriscono gli altri, non si sta realmente utilizzando più thread. Questo perché stai chiamando il metodo run(), che finisce per fare il lavoro nel thread chiamante.

Ora, per rispondere al resto della domanda, che prendo a significare come si massimizza l'efficienza di un processo multithread. Questa non è una domanda semplice, ma ti darò le basi. (Altri, sentiti libero di suonare.)

Il modo migliore per massimizzare l'efficienza del tuo processo è provare a fare tutti i thread per la stessa quantità di lavoro, e cercare di impedire che si blocchino. Vale a dire, è compito tuo "bilanciare" il carico di lavoro per far funzionare l'applicazione in modo efficiente.

In generale, non è possibile assegnare un thread per l'esecuzione su un particolare core della CPU; di solito è il lavoro del sistema operativo e le CPU stesse. Il sistema operativo pianifica il processo (utilizzando le priorità fornite dall'utente) e quindi le CPU possono eseguire la propria pianificazione a livello di istruzioni. Oltre a stabilire le priorità, il resto della pianificazione è completamente fuori dal tuo controllo.

MODIFICA: Sono dipendente dal punto e virgola.

Problemi correlati