2012-05-08 85 views
6

我有一個執行長時間計算的程序,所以我想加快其性能。於是,我就在此刻推出3個線程,但java.exe仍佔有CPU使用率(所以,只使用一個CPU)的25%,即使我嘗試使用.setPriority(Thread.MAX_PRIORITY);java.exe設置優先級的實時它的遺體(24) 。我試圖使用RealtimeThread,但似乎它工作得更慢。如果每個線程都分配給一個處理器,並且總CPU使用率增加到75%,但是我不知道該怎麼做。這就是我的代碼現在的樣子:爲什麼我的線程程序只使用一個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

使用'。開始()'正如其他人指出的 - 然後你可能* *要調度留給調度,而不是與自己的優先級玩。除非您對線程調度有相當的瞭解,否則調度程序的工作可能會比做得更好(最好)。 –

+0

[java thread - run()和start()方法]的可能重複(http://stackoverflow.com/questions/3027495/java-thread-run-and-start-methods) – 2012-05-08 22:04:04

回答

23

你實際上並沒有使用線程。

你需要調用.start(),不.run()

11

這有沒有關係的CPU - 你沒有實際啓動3個線程,你正在運行的主線程上的一切。要啓動一個線程,請調用它的start()方法,而不是run()

6

首先,正如其他人所說的,你並沒有真正使用多個線程。這是因爲你正在調用run()方法,最終在調用線程中完成這項工作。

現在,爲了解決您的問題,我採取的意思是一個人如何最大化多線程處理的效率的其餘部分。這不是一個簡單的問題,但我會給你基本的。 (其他人隨時可以參加。)

最大限度地提高流程效率的最佳方法是嘗試使所有線程都執行大致相同的工作量,並嘗試阻止它們被阻止。也就是說,爲了使應用程序高效運行,「平衡」工作負載是您的工作。

一般情況下,你不能分配一個線程在一個特定的CPU內核;這通常是操作系統和CPU本身的工作。操作系統調度進程(使用您提供的優先級),然後CPU可以在指令級進行自己的調度。除了設置優先級之外,其餘的時間安排完全不在你的掌控之中。

編輯:我沉迷於分號。

相關問題