java多线程的问题
ringa_lee
ringa_lee 2017-04-17 13:34:43
0
2
401

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

package me.ele.coffe.hr.stress.test;  

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),就打印不出来了。。。
求帮忙看看 有没有哪里写的不对

ringa_lee
ringa_lee

ringa_lee

全部回覆(2)
迷茫

問題出在這

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

當線程start以後, for迴圈中的threads這個值就變不斷變小,所以你的執行緒本來就沒執行完。你把threads換成一個final的常數就可以了。

左手右手慢动作

是這個threads的原因,你的主線程main中和線程使用的同一個threads計數,所以導致threads指定40時,不一定會開40個線程,可能出現如下:

前面已開啟了23個線程,且在主線程main的for操作之前完成,那麼此時
i = 23, threads = 23,
所以不會再開線程了,所以導致threads無法等於0,所以無法輸出!

個人建議使用executor、future來寫線程,透過atomicinteger計數,你可以了解下!

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板