栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java线程创建开销

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java线程创建开销

这是一个微基准测试示例:

public class ThreadSpawningPerformanceTest {static long test(final int threadCount, final int workAmountPerThread) throws InterruptedException {    Thread[] tt = new Thread[threadCount];    final int[] aa = new int[tt.length];    System.out.print("Creating "+tt.length+" Thread objects... ");    long t0 = System.nanoTime(), t00 = t0;    for (int i = 0; i < tt.length; i++) {         final int j = i;        tt[i] = new Thread() { public void run() {     int k = j;     for (int l = 0; l < workAmountPerThread; l++) {         k += k*k+l;     }     aa[j] = k; }        };    }    System.out.println(" Done in "+(System.nanoTime()-t0)*1E-6+" ms.");    System.out.print("Starting "+tt.length+" threads with "+workAmountPerThread+" steps of work per thread... ");    t0 = System.nanoTime();    for (int i = 0; i < tt.length; i++) {         tt[i].start();    }    System.out.println(" Done in "+(System.nanoTime()-t0)*1E-6+" ms.");    System.out.print("Joining "+tt.length+" threads... ");    t0 = System.nanoTime();    for (int i = 0; i < tt.length; i++) {         tt[i].join();    }    System.out.println(" Done in "+(System.nanoTime()-t0)*1E-6+" ms.");    long totalTime = System.nanoTime()-t00;    int checkSum = 0; //display checksum in order to give the JVM no chance to optimize out the contents of the run() method and possibly even thread creation    for (int a : aa) {        checkSum += a;    }    System.out.println("Checksum: "+checkSum);    System.out.println("Total time: "+totalTime*1E-6+" ms");    System.out.println();    return totalTime;}public static void main(String[] kr) throws InterruptedException {    int workAmount = 100000000;    int[] threadCount = new int[]{1, 2, 10, 100, 1000, 10000, 100000};    int trialCount = 2;    long[][] time = new long[threadCount.length][trialCount];    for (int j = 0; j < trialCount; j++) {        for (int i = 0; i < threadCount.length; i++) { time[i][j] = test(threadCount[i], workAmount/threadCount[i]);         }    }    System.out.print("Number of threads ");    for (long t : threadCount) {        System.out.print("t"+t);    }    System.out.println();    for (int j = 0; j < trialCount; j++) {        System.out.print((j+1)+". trial time (ms)");        for (int i = 0; i < threadCount.length; i++) { System.out.print("t"+Math.round(time[i][j]*1E-6));        }        System.out.println();    }}}

在Intel Core2 Duo E6400 @ 2.13 GHz上使用32位Sun的Java 1.6.0_21 Client VM的64位Windows
7上的结果如下:

Number of threads  1    2    10   100  1000 10000 1000001. trial time (ms) 346  181  179  191  286  1229  113082. trial time (ms) 346  181  187  189  281  1224  10651

结论:由于我的计算机有两个内核,因此两个线程的工作速度几乎是预期的两倍。我的计算机每秒可以产生近10000个线程,即 线程创建开销为0.1毫秒
。因此,在这样的机器上,每秒几百个新线程造成的开销可以忽略不计(也可以通过比较2线程和100线程列中的数字来看出)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483295.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号