线程池
线程
1.线程的生命周期、开始、运行、结束
2.多线程调用start、run方法
运行这段代码
public static void main(String[] args) throws InterruptedException {
Long start = System.currentTimeMillis();
final Random random = new Random();
final List<Integer> list = new ArrayList<>();
for (int i =0;i< 100000;i++){
Thread thread = new Thread(){
public void run(){
list.add(random.nextInt());
}
};
thread.start();;
thread.join();
}
System.out.println("time:"+(System.currentTimeMillis()-start));
System.out.println("size:"+list.size());
}
我的电脑的输出结果是:time:31283
size:100000 ,这是使用线程来跑。
使用线程池后
public static void main(String[] args) throws InterruptedException {
Long start = System.currentTimeMillis();
final Random random = new Random();
final List<Integer> list = new ArrayList<>();
//初始化一个java自带的线程池
/*
* Executors 工具类,三种实现线程池的方式
*
* */
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i =0;i< 100000;i++){
executorService.execute(new Runnable() {
@Override
public void run() {
list.add(random.nextInt());
}
});
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.DAYS);
System.out.println("time:"+(System.currentTimeMillis()-start));
System.out.println("size:"+list.size());
}
输出:
time:225
size:100000
核心方法的参数如下
假设设定核心数是10 ,最大核心数是20,任务有30个,它的工作是30个。运行流程如下,也是面试点。
在线程执行任务时:三个方法分别调用不同分配方式的核心线程和非核线程,具体的情况就不在这描述。
三种三种线程运行方式都是以这些参数为基础。
1.newCachedThreadPool 最快
2.newFixedThreadPool 慢
3.newSingleThreadExecutor 最慢
注意线程复用:一个线程可以干多个任务,所以还是根据任务场景不同来具体分析。
但是以上三种方法阿里巴巴的开发手册都不建议使用。为什么?
因为线程无限。
newfix是什么问题?他是无界的,浪费内存,极限情况下回出现oom问题;
newcached呢?它默认是work是最大,会浪费线程,会使cpu负载过大。
newSingle呢?和newfix是一样的道理,浪费内存。
=========================================================
那推荐什么呢?
自定义线程。
根据任务情况自定义线程,设定核心数,最大线程数,
那为什么线程池快,而线程运行慢吗?
我也不懂。正在搜索资料。