测试解决的问题:
线程的上下文切换真的很耗时么,耗时的话到底耗时到什么程度。
测试的机器是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多线程测试工具的重要性和使用,以"JMeter"为例,来阐述如何通过此类工具进行高效的压力测试和系统瓶颈...
Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。本示例代码集合("java多线程代码demo")涵盖了多线程的多种实现方式,包括Thread类和Runnable接口的使用,以及对死锁的理解与避免...
以下是对"java多线程测试实例"的详细解析: 1. **线程的创建方式** - 实现`Runnable`接口:创建一个类实现`Runnable`接口,然后将其实例传递给`Thread`类的构造函数创建线程。 - 继承`Thread`类:创建一个类直接...
在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...
Java 模拟线程并发是编程领域中的一个重要概念,尤其在多核处理器和高并发应用中,理解并熟练掌握线程并发技术对于提升程序性能至关重要。在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable...
Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器...
本节将深入探讨Java线程中的“秒表”概念,这是一种用于度量时间间隔的实用工具,常用于性能测试和调试。 首先,让我们理解Java如何创建和管理线程。在Java中,有两种方式来创建线程:继承Thread类或实现Runnable...
在分析Java 多线程特性的基础上, 探讨了Java 多线程的测试策略及测试方法, 提出Java 多线程测试由类测试、集成模块测试和系统测试三个层次组成, 并讨论了多线程的继承测试、同步测试以及效率测试。
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
Java线程是多任务编程的重要概念,特别是在大型的、复杂的软件系统中,它允许程序同时执行多个不同的任务,提升程序的并发性和效率。本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在...
总的来说,Java线程适合CPU密集型任务,能充分利用硬件资源,但面临上下文切换和同步问题;而协程则在IO密集型任务中表现出色,拥有更高的并发性和更低的开销。开发者应根据具体应用场景选择合适的并发模型,以优化...
在“JAVA编写的多线程小弹球测试”项目中,开发者利用Java语言创建了一个生动有趣的多线程应用,即一个模拟小弹球运动的程序。这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示...
### Java线程学习知识点 #### 一、Java线程概览 - **定义与作用**:线程是在程序中独立且并发执行的路径。在Java中,线程被设计为语言的一部分,而不是作为操作系统的底层工具。每个Java程序至少包含一个主线程,在...
本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...
在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地执行多个任务。在多线程环境中,程序的...在编写`test`这样的示例时,你可以创建并启动线程,测试各种线程控制和同步方法,从而加深对Java线程的理解。
下面我们将详细讨论如何使用Java线程来实现这一功能。 首先,我们需要理解线程的基本概念。线程是程序执行的最小单元,一个进程可以包含多个线程,每个线程都有自己的程序计数器、寄存器和栈空间,但共享同一块内存...
Java线程赛马优先级示例是一个典型的多线程编程问题,它涉及到Java中的线程管理、优先级机制以及并发执行的概念。在这个示例中,我们有两个线程,一个被标记为高优先级,另一个为低优先级,它们在程序运行时会进行...
4. **线程优先级与守护线程**:Java线程有优先级之分,可以影响调度,但实际效果取决于操作系统。守护线程(Daemon Thread)是一种特殊类型的线程,当它是系统中唯一运行的线程时,JVM会自动退出。 5. **并发集合与...
简单的java线程代码 对Thread中的sleep方法进行测试