随机对比,一个是线程池使用方法 一个是不用线程池使用方法
产生一个随机整数,并且把这个随机整数加入到一个队列中
package com.test.java;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ExecutorTest {
public static void main(String[] args) throws InterruptedException {
ThreadPoolTest t = new ThreadPoolTest();
t.test(10000);
t.t2(10000);
}
}
class ThreadPoolTest{
/**
* 使用线程池
* 耗费时间:17
* 数组大小:10000
* @param count
*/
public void test(int count){
long startTime = System.currentTimeMillis();
final List<Integer> l = new LinkedList<>();
ThreadPoolExecutor tp = new ThreadPoolExecutor(1,1,60,TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>());
final Random random = new Random();
for(int i= 0;i<count;i++){
tp.execute(new Runnable(){
@Override
public void run() {
l.add(random.nextInt());
}
});
}
tp.shutdown();
try {
tp.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("耗费时间:"+(System.currentTimeMillis()-startTime));
System.out.println("数组大小:"+l.size());
}
/**
* 不用线程池
* 结果:
* 耗费时间:1979
* 数组大小:10000
* @param count
*/
public void t2(int count){
long startTime = System.currentTimeMillis();
final List<Integer> l = new LinkedList<>();
final Random random = new Random();
Thread thread;
for (int i = 0; i < count; i++) {
thread = new Thread(){
public void run() {
l.add(random.nextInt());
}
};
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("耗费时间:"+(System.currentTimeMillis()-startTime));
System.out.println("数组大小:"+l.size());
}
}
其中,t1为使用线程池(ThreadPoolExecutor)方法, 一个是不使用,结果对比很明显:
上面两种方式的差异在于: 使用线程池的方式是复用线程,而不是使用线程池的方式是每次都要创建线程;
在JAVA中,我们主要使用的线程池就是ThreadPooExecutor,此外还有定时的线程池ScheduledPoolExecutor;
总结:
线程池可以减低创建线程的开销,线程池在执行结束后进行的是回收操作,而是不真正销毁线程;