猿问

java多线程的问题

仿照网上写了一个方法统计n个线程同时调一个方法,都执行完需要多长时间,发现一个奇怪的问题
packageme.ele.coffe.hr.stress.test;
publicclasstest{
privatestaticIntegererror=0;
privatestaticIntegerthreads=40;
privatestaticLongstartTime;
privatestaticLongendTime;
publicstaticvoidmain(String[]args){
System.out.println("begintesting");
System.out.println("线程数"+threads);
WorkThread[]workThreads=newWorkThread[threads];
for(inti=0;iworkThreads[i]=newWorkThread();
}
startTime=System.currentTimeMillis();
for(inti=0;iworkThreads[i].start();
}
}
privatestaticclassWorkThreadextendsThread{
publicvoidrun(){
try{
//要测试的函数
Strings=testFunctoin.testString();
}catch(Exceptione){
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),就打印不出来了。。。
求帮忙看看有没有哪里写的不对
慕后森
浏览 277回答 2
2回答

慕标5832272

问题出在这for(inti=0;i

杨魅力

是这个threads的原因,你的主线程main中和线程使用的同一个threads计数,所以导致threads指定40时,不一定会开40个线程,可能出现如下:前面已开启了23个线程,且在主线程main的for操作之前完成,那么此时i=23,threads=23,所以不会再开线程了,所以导致threads无法等于0,所以无法输出!个人推荐使用executor、future来写线程,通过atomicinteger计数,你可以了解下!
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答