测试解决的问题:
线程的上下文切换真的很耗时么,耗时的话到底耗时到什么程度。
测试的机器是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 线程安全的几个测试小例子,充分的理解JMM中的线程内存模型
这些java的代码demo,是本人几篇多线程文章的实例代码 http://www.cnblogs.com/yaoxiaowen/p/6576779.html
Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发
Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器...
在分析Java 多线程特性的基础上, 探讨了Java 多线程的测试策略及测试方法, 提出Java 多线程测试由类测试、集成模块测试和系统测试三个层次组成, 并讨论了多线程的继承测试、同步测试以及效率测试。
在实际项目中 多线程用的比较广泛 本人根据网络资源整理出了一个小小的多线程实例 大家有需要可以下载
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
利用Java多线程和JFrame编写程序,实现企鹅在界面里移动
现代多线程 JAVA和c++多线程实现 测试和调试
简单的java线程代码 对Thread中的sleep方法进行测试
JAVA写得小弹球,多线程。随机出现,随机选择颜色,遇到墙壁反弹。
Java线程赛马优先级示例,左侧的是高优先级,右侧的是低优先级。点击“Start”开始测试。
一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 ...运行DispatcherMain可以测试,库结构自己可以根据code随便改成父子表关系的就行
NULL 博文链接:https://guoba6688-sina-com.iteye.com/blog/733778
Java多线程Junit测试包,支持多线程测试.
当前数字化转型时代,大数据处理及人工智能应用陆续应用到日常的生产活动中,涉及到大量的人机协同和人机交互的应用场景,数据发掘及分析为千人万面的辅助支撑越来越离不开多线程。本书详细介绍了多线程知识,是一本...
java的多线程聊天系统 java 软件测试 测试计划 java的多线程聊天系统 java 软件测试 测试计划
java FTP多线程 批量 断点续传,使用 1.建一个支持多线程FTP服务端; 如:xxftp有Windows和Linux版本; 2.建一个项目导入文件测试;
大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而自己网络又非常好的情况下,不建议使用线程池进行下载,因为...