仿照网上写了一个方法 统计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),就打印不出来了。
求帮忙看看 有没有哪里写的不对
问题出在这
for (int i = 0; i < threads; i++) {
workThreads[i].start();
}
当线程start以后, for循环中的threads这个值就变不断变小,所以你的线程本来就没执行完。你把threads换成一个final的常量就可以了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。