我有一個庫在Linux和Windows上支持Java中的線程關聯。 https://github.com/peter-lawrey/Java-Thread-Affinity
如果隔離CPU,則可以確保您分配的CPU不會用於其他任何內容(非屏蔽中斷除外)這在Linux AFAIK中效果最佳。
如果您使用非阻塞NIO忙於等待阻塞IO,則可以獲得較低延遲結果。後者在負載下工作得最好,在較低負載下延遲可以增加。
你可能會發現這個庫很有趣https://github.com/peter-lawrey/Java-Chronicle它允許你每秒鐘持有數百萬條消息,可選擇到第二個進程。
BTW:線程優先級只是一個暗示,該操作系統是免費的忽略它(常常)
一個簡單的例子VS冷碼比較溫暖。它所做的只是重複複製一個數組並重新定時。一旦代碼和數據變暖,你不會期望它會變慢,但所需要的只是一個10毫秒的延遲,即使是在一臺相當的機器上,也可以顯着減緩複製所需的時間。
public static void main(String... args) throws InterruptedException {
int[] from = new int[60000], to = new int[60000];
for (int i = 0; i < 10; i++)
copy(from, to); // warm up
for (int i = 0; i < 10; i++) {
long start = System.nanoTime();
copy(from, to);
long time = System.nanoTime() - start;
System.out.printf("Warm copy %,d us%n", time/1000);
}
for (int i = 0; i < 10; i++) {
Thread.sleep(10);
long start = System.nanoTime();
copy(from, to);
long time = System.nanoTime() - start;
System.out.printf("Cold copy %,d us%n", time/1000);
}
}
private static void copy(int[] a, int[] b) {
for (int i = 0, len = a.length; i < len; i++)
b[i] = a[i];
}
打印
Warm copy 20 us
Warm copy 20 us
Warm copy 19 us
Warm copy 23 us
Warm copy 20 us
Warm copy 20 us
Cold copy 100 us
Cold copy 80 us
Cold copy 89 us
Cold copy 92 us
Cold copy 80 us
Cold copy 112 us
[看這篇文章](http://stackoverflow.com/questions/2238272/java-thread-affinity),這是關於一種設置線程的處理器親和力,當你使用Java,雖然它是真的使用JNI來完成這項工作。 – 2012-08-09 17:30:02
您希望有兩個線程處理所有網絡流量。至多會使用100%的兩個內核。你在100%運行四個內核,所以從這裏的信息看,你可能沒有問題。是什麼讓你覺得你有問題? – 2012-08-09 17:49:20
抱歉不明確。新流量目前由8個線程處理,並且它們不會消耗超過100%的cpu。 400%是整個應用程序負載。我想通過使用單個(或2個)異步nw線程來減少線程數量。 – user1588261 2012-08-09 17:59:28