java執行緒測試
測試解決的問題:
執行緒的上下文切換真的很耗時麼,耗時的話到底耗時到什麼程度。
測試的機器是4核cpu,處理同樣多的任務,看看耗時情況。
程式碼如下:
private static void testContextSwitch()
{
AtomicInteger count = new AtomicInteger(0);
long totolLoopNum = 1000000000;
int threadNum = 1000;
long loopNum = totolLoopNum/threadNum;
System.out.println("totolLoopNum:"+totolLoopNum);
System.out.println("threadNum:"+threadNum+"\tloopNum:"+loopNum);
ExecutorService e = Executors.newFixedThreadPool(threadNum);
long startTime = System.currentTimeMillis();
for (int i = 0; i < threadNum; i++)
{
e.execute(createLoopRunnable(count, loopNum, threadNum, startTime));
}
}
private static Runnable createLoopRunnable(final AtomicInteger count, final long loopNum, final int threadNum,
final long startTime)
{
return new Runnable()
{
@Override
public void run()
{
for (int j = 0; j < 100; j++)
{
int i = 0;
while (true)
{
if (i > loopNum)
break;
i++;
}
}
int total = count.incrementAndGet();
if (total == threadNum)
System.out.println("cost:" + (System.currentTimeMillis() - startTime));
}
};
}
輸出結果如下:
// totolLoopNum:1000000000
// threadNum:1 loopNum:1000000000
// cost:127198 cpu使用20%-40%
// totolLoopNum:1000000000
// threadNum:2 loopNum:500000000
// cost:67120 cpu使用50%
// totolLoopNum:1000000000
// threadNum:4 loopNum:250000000
// cost:36015 cpu使用100%
// totolLoopNum:1000000000
// threadNum:64 loopNum:15625000
// cost:35905 cpu使用100%
// totolLoopNum:1000000000
// threadNum:512 loopNum:1953125
// cost:35905
// totolLoopNum:1000000000
// threadNum:1000 loopNum:1000000
// cost:35955
可以看出:
1.線上程小於4的情況下cpu是不能跑到100%的。
2.隨著執行緒數目的增加,處理任務的耗時越來越短,知道開到1000個執行緒的時候才開始有微弱的增加。
可以看出執行緒的上下文切換貌似不是很耗時。。。
實際應用中,比如阻塞讀資料。經常會寫如下類似程式碼:
//socket連線沒有中斷,阻塞讀資料
while(socket != null)
{
//阻塞的讀寫資料
}
程式碼1:
while (true) {
// 阻塞的讀寫資料
try {
if (queue.size() != 0) {
System.out.println(1);
// read;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
程式碼2:
while (true) {
// 阻塞的讀寫資料
try {
if (queue.take() != null) {
System.out.println(1);
// read;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
加入幾個阻塞執行緒到執行緒池中發現,程式碼2加入後消耗的實踐較少,程式碼1加入後消耗的實踐較多。
通過jstack分析發現:
程式碼2中的執行緒處於WAITING狀態,而程式碼1所有執行緒都是RUNNABLE。
java.util.concurrent.locks.LockSupport
http://forums.sun.com/thread.jspa?threadID=5353864
"pool-1-thread-3" prio=6 tid=0x01a0f800 nid=0x1fc4 waiting on condition [0x0c07f000..0x0c07fbe8]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x03ae66f0> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:422)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:857)
at lsd.Main$2.run(Main.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
相關文章
- Java執行緒小刀牛試Java執行緒
- 測試小花花重口味java多執行緒,慎入。。。。。Java執行緒
- java執行緒的筆試題Java執行緒筆試
- 程式池、執行緒池效率測試執行緒
- Java多執行緒——執行緒Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java執行緒:執行緒中斷Java執行緒
- pytest多程式/多執行緒執行測試用例執行緒
- 有關Junit的多執行緒測試執行緒
- java執行緒Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- 多執行緒伺服器壓力測試執行緒伺服器
- 開源多執行緒效能測試工具-sysbench執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- Java執行緒:執行緒的同步與鎖Java執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- java 停止執行緒Java執行緒
- java——多執行緒Java執行緒
- java 多執行緒Java執行緒