开发者社区> 问答> 正文

java多线程统计时间的问题

仿照网上写了一个方法 统计n个线程同时调一个方法,都执行完需要多长时间 ,发现一个奇怪的问题

public class test {  
    private static Integer error = 0;  
    private static Integer threads = 40;  
    private static Long startTime;
    private static Long endTime; 
    public static void main(String[] args) {  
        System.out.println("begin testing");
        System.out.println("线程数" + threads) ;
        WorkThread[] workThreads = new WorkThread[threads];  
        for (int i = 0; i < threads; i++) {  
            workThreads[i] = new WorkThread();  
        }  
        startTime = System.currentTimeMillis();  

        for (int i = 0; i < threads; i++) {  
            workThreads[i].start();  
        }  

    }  
    private static class WorkThread extends Thread {  
        public void run() {   
            try { 
               //要测试的函数 
                String s = testFunctoin.testString();
            } catch (Exception e) {  
                synchronized (error) {  
                    error++;  
                }  
                e.printStackTrace();  
            }  

            synchronized (threads) {  
                System.out.println("当前运行线程:====================" + getName());
                threads--;    
                if (threads == 0) { 
                    endTime = System.currentTimeMillis();
                    System.out.printf("总耗时:%d毫秒\n",endTime - startTime);  
                    System.out.printf("连接失败数量:%d\n", error);  
                }  
            }  
        }  
    }  
} 

发现当线程数较小时 可以打印出总耗时和连接失败数量但当线程数较大时(比如40),就打印不出来了。
求帮忙看看 有没有哪里写的不对

展开
收起
蛮大人123 2016-02-27 15:58:38 3252 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    问题出在这
    for (int i = 0; i < threads; i++) {

    workThreads[i].start();  

    }
    当线程start以后, for循环中的threads这个值就变不断变小,所以你的线程本来就没执行完。你把threads换成一个final的常量就可以了。

    2019-07-17 18:49:00
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载