`
javaG
  • 浏览: 553074 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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)
分享到:
评论
2 楼 alosin 2012-05-07  
我也是,用了java自带线程池后很多空闲的线程,最后导致不能创建新的线程了,线程池不是要重用么
1 楼 wuche 2011-07-03  
线程很多这个状态,有问题吗?我在一个项目中也遇到了这个问题,一共206个线程,有196个是这个状态
"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) 



欢迎加我MSN聊聊,huiquanhuang@hotmail.com

相关推荐

    JAVA多线程测试工具

    Java多线程测试工具在软件开发中扮演着至关重要的角色,尤其在性能优化和系统压力测试方面。本文将深入探讨Java多线程测试工具的重要性和使用,以"JMeter"为例,来阐述如何通过此类工具进行高效的压力测试和系统瓶颈...

    java线程安全测试

    Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...

    java多线程代码demo

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。本示例代码集合("java多线程代码demo")涵盖了多线程的多种实现方式,包括Thread类和Runnable接口的使用,以及对死锁的理解与避免...

    java多线程测试实例

    以下是对"java多线程测试实例"的详细解析: 1. **线程的创建方式** - 实现`Runnable`接口:创建一个类实现`Runnable`接口,然后将其实例传递给`Thread`类的构造函数创建线程。 - 继承`Thread`类:创建一个类直接...

    Java多线程测试程序,

    在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...

    Java 模拟线程并发

    Java 模拟线程并发是编程领域中的一个重要概念,尤其在多核处理器和高并发应用中,理解并熟练掌握线程并发技术对于提升程序性能至关重要。在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable...

    java 线程 dump 分析工具 2.3.3

    Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器...

    Java线程模块Java线程之秒表

    本节将深入探讨Java线程中的“秒表”概念,这是一种用于度量时间间隔的实用工具,常用于性能测试和调试。 首先,让我们理解Java如何创建和管理线程。在Java中,有两种方式来创建线程:继承Thread类或实现Runnable...

    论文研究-Java多线程测试策略及测试方法探讨.pdf

    在分析Java 多线程特性的基础上, 探讨了Java 多线程的测试策略及测试方法, 提出Java 多线程测试由类测试、集成模块测试和系统测试三个层次组成, 并讨论了多线程的继承测试、同步测试以及效率测试。

    Java中懒汉单例设计模式线程安全测试

    Java中懒汉单例设计模式线程安全测试,单例设计模式的测试

    简单的java线程demo

    Java线程是多任务编程的重要概念,特别是在大型的、复杂的软件系统中,它允许程序同时执行多个不同的任务,提升程序的并发性和效率。本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在...

    java线程与协程效果对比

    总的来说,Java线程适合CPU密集型任务,能充分利用硬件资源,但面临上下文切换和同步问题;而协程则在IO密集型任务中表现出色,拥有更高的并发性和更低的开销。开发者应根据具体应用场景选择合适的并发模型,以优化...

    JAVA编写的多线程小弹球测试

    在“JAVA编写的多线程小弹球测试”项目中,开发者利用Java语言创建了一个生动有趣的多线程应用,即一个模拟小弹球运动的程序。这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示...

    Java线程 学习

    ### Java线程学习知识点 #### 一、Java线程概览 - **定义与作用**:线程是在程序中独立且并发执行的路径。在Java中,线程被设计为语言的一部分,而不是作为操作系统的底层工具。每个Java程序至少包含一个主线程,在...

    现代多线程 JAVA和c++多线程实现 测试和调试

    本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...

    JAVA 线程中启动线程

    在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地执行多个任务。在多线程环境中,程序的...在编写`test`这样的示例时,你可以创建并启动线程,测试各种线程控制和同步方法,从而加深对Java线程的理解。

    JAVA 线程实现数据库的主从同步更新

    下面我们将详细讨论如何使用Java线程来实现这一功能。 首先,我们需要理解线程的基本概念。线程是程序执行的最小单元,一个进程可以包含多个线程,每个线程都有自己的程序计数器、寄存器和栈空间,但共享同一块内存...

    Java线程赛马优先级示例.rar

    Java线程赛马优先级示例是一个典型的多线程编程问题,它涉及到Java中的线程管理、优先级机制以及并发执行的概念。在这个示例中,我们有两个线程,一个被标记为高优先级,另一个为低优先级,它们在程序运行时会进行...

    JAVA多线程教材

    4. **线程优先级与守护线程**:Java线程有优先级之分,可以影响调度,但实际效果取决于操作系统。守护线程(Daemon Thread)是一种特殊类型的线程,当它是系统中唯一运行的线程时,JVM会自动退出。 5. **并发集合与...

Global site tag (gtag.js) - Google Analytics