线程池的介绍 ThreadPool四种线程池

ThreadPool四种线程池
线程池使用对象的概念,目的是减小对象的创建和注销的开支,减轻JVM的压力。

为什么使用线程池呢?因为newTread有很多弊端。

1.新建对象性能差;

2.线程之间缺乏统一管理,可能无限创建线程,相互之间竞争会带来过多的系统损耗,

  到最后司机或者oom;

3.缺乏更多的功能,例如定时执行,定期执行,线程中断,可以基本理解为线程池扩展许多新功能;


Java可以通过Executors创建四中线程池,分别为:

1.newCachedThreadPool

  创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,

   则新建线程;

2.newFixedThreadPool

扫描二维码关注公众号,回复: 1375867 查看本文章

    创建一个定长线程池,可控制线程最大并发数,超出的线程会在你队列中等待

  线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,

那么线程池会补充一个新线程。

3. newScheduledThreadPool

    创建一个定长的线程池,支持定时即周期性任务执行

4.newSingleThreadPool

    创建一个单线程化的线程池,它只会用唯一 的工作线程来执行任务,保证所有

    任务按照指定顺序(FIFO)执行,如果这个唯一的线程因为异常结束,那么

会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

example:

 一,

ExecutorService cachedPool=Executors.newCachedThreadPool();

   for(int i=0;i<1000;i++){

final int index=i;

try{  Thread.sleep(index);}

catch(InterruptedException e){

e.peintStackTrace();}

CachedPool.execute(new Runnable){

public void run(){

Log.i("打印编号",""+index);}

});}

线程池为无限大,当执行第二个任务是第一个任务已经完成,会复用执行第一个任务的线程,

而不用每次新建线程;

二,

  ExecutorService fixdeThreadPool=Executor.newFixedThreadPool(5);

   for(int i=0;i<1000;i++){

final int index=i;

fixdeThreadPool.execute(new Runnable(){

public void run(){

try{Thread.sleep(index*1000);}

catch(InterruptedException e){

e.printStackTrace();}

Log.i("打印数据",""+index);}

});}

如上,表示每个任务之间的间隔是index秒

定长线程池的大小最好根据系统资源进行设置。

三,

newSingleThreadPool

ExecutorService singlePool=Executors.newSingleThreadExecutor();

for(int i=0;i<1000;i++){

final int index=1;

singlePool.execute(new Runable(){

public void run(){

try{

Thread.sleep(1*1000);

Log.i("打印数据",""+index);}});}

结果依次输出,相当于顺序执行各个任务。

Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但

可能IO阻塞性的操作

四,

a.延迟操作:

ScheduledExecutorService schemedPool=Executors.newScheduledThreadPool(5);

schemedPool.schedule(new Runnable(){

public void run(){

Log.i("打印","任务执行完毕");}

},10,TimeUnit.SECONDS);

第一个参数是要操作的任务,第二个参数是要延迟的时间,第三个参数是时间的单位;

以上表示五个线程在10秒后运行;

b.定周期性任务

ScheduledExecutorService schemedPool=Executor.newScheduledThreadPool(5);//参数最大并行数

schemedPool.scheduleAtFixedRate(new Runnable(){

public void run(){

Log.i("打印","我正在执行");}},10,5,TimeUnit.SECONDS);}

第一个参数是要执行的任务,第二个参数是周期时间(每隔多长时间触发一次),第四个参数是时间单位

上面表示延迟10秒后,没5秒执行一次;

猜你喜欢

转载自blog.csdn.net/qq_42032315/article/details/80466740