代码如下:
public class ThreadBody implements Runnable {
public void run() {
for (int i = 1; i < 500000000; i++) {
}
}
public void runSingleThread() {
for (int i = 1; i < 500000000; i++) {
}
}
}
//效率测试代码
public static void main(String[] args) {
//单线程开始
Long start1 = System.currentTimeMillis();
System.out.println("start1:"+start1);
for(int i = 0;i<20;i++)
{
ThreadBody threadBody = new ThreadBody();
threadBody.runSingleThread();
}
Long end1 = System.currentTimeMillis();
System.out.println("end1:"+end1+" 毫秒数:"+(end1-start1));//2毫秒
//单线程结束
//多线程开始
Long start2 = System.currentTimeMillis();
System.out.println("start2:"+start2);
BlockingQueue<Runnable> queue = new LinkedBlockingDeque<Runnable>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(3,6,1,TimeUnit.HOURS,queue);
ThreadBody threadBody = new ThreadBody();
for(int i = 0;i<20;i++)
{
executor.execute(threadBody);
}
Long end2 = System.currentTimeMillis();
System.out.println("end2:"+end2+" 毫秒数:"+(end2-start2));//4毫秒
//多线程结束
}
单线程比多线程更快。你的测试代码只是用了CPU资源。因为多线程需要处理线程的开销,开销多了自然没有单线程快。
多线程是为了更充分的利用计算机的资源。比如网络,IO,CPU...如果你在for循环里加入一个磁盘写入操作,多线程就会比单线程快了
确实,如果执行方法体改为读取一个文件,执行结果为:
end1:1416901673383 毫秒数:153
end2:1416901673404 毫秒数:21
很困惑哇,能上代码不?
追答就是单个任务的消耗时间少于初始化线程需要的时间。
好比吃一个包子跟从碗里拿一个包子的时间差不多。