Java(Android)线程池

来源:互联网 发布:淘宝卖家拒签怎么办 编辑:程序博客网 时间:2024/05/17 21:50

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。

1、new Thread的弊端
执行一个异步任务你还只是如下new Thread吗?

new Thread(new Runnable() {     @Override    public void run() {        // TODO Auto-generated method stub    }}).start();
a. 每次new Thread新建对象性能差。那你就out太多了,new Thread的弊端如下:

b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

 

2、Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

ExecutorServicecachedThreadPool=Executors.newCachedThreadPool();for(inti=0;i<10;i++){    finalintindex=i;    try{        Thread.sleep(index*1000);    }catch(InterruptedExceptione){        e.printStackTrace();    }     cachedThreadPool.execute(newRunnable(){         @Override        publicvoidrun(){            System.out.println(index);        }    });}

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

 

(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

ExecutorServicefixedThreadPool=Executors.newFixedThreadPool(3);for(inti=0;i<10;i++){    finalintindex=i;    fixedThreadPool.execute(newRunnable(){         @Override        publicvoidrun(){            try{                System.out.println(index);                Thread.sleep(2000);            }catch(InterruptedExceptione){                // TODO Auto-generated catch block                e.printStackTrace();            }        }    });}

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。

 

(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

ScheduledExecutorServicescheduledThreadPool=Executors.newScheduledThreadPool(5);scheduledThreadPool.schedule(newRunnable(){     @Override    publicvoidrun(){        System.out.println("delay 3 seconds");    }},3,TimeUnit.SECONDS);

表示延迟3秒执行。

 

定期执行示例代码如下:

scheduledThreadPool.scheduleAtFixedRate(newRunnable(){     @Override    publicvoidrun(){        System.out.println("delay 1 seconds, and excute every 3 seconds");    }},1,3,TimeUnit.SECONDS);

表示延迟1秒后每3秒执行一次。

ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。

 

(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

ExecutorServicesingleThreadExecutor=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++){    finalintindex=i;    singleThreadExecutor.execute(newRunnable(){         @Override        publicvoidrun(){            try{                System.out.println(index);                Thread.sleep(2000);            }catch(InterruptedExceptione){                // TODO Auto-generated catch block                e.printStackTrace();            }        }    });}


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

现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝id被监控怎么办 快递扫描漏掉了怎么办 千牛空间不足怎么办 iphone储存将满怎么办 微销通老是请求拒绝怎么办 联璧金融的钱怎么办 店家不给退货怎么办 京东换货不成功怎么办 京东审核关闭怎么办 服装店盘货衣服不对怎么办 盘点衣服少了怎么办 超市盘点少东西怎么办 货到付款买家不收怎么办 快递员忘记收钱怎么办 发货了买家退款怎么办 买家一直不退款怎么办 京东商家退货怎么办 发货后退货邮费怎么办 淘宝货到退款怎么办 淘宝收不到货怎么办 淘宝不处理投诉怎么办 实体店不能退货怎么办 顾客无理由退货怎么办 京东衣服质量问题怎么办 买家退货要运费怎么办 卖家不给退运费怎么办 淘宝申请退款卖家不退怎么办 网购商家报复怎么办 淘宝退货店家不同意怎么办 淘宝退货不同意退款怎么办 运费险没收到怎么办 地税逾期未申报怎么办 转转买家发到付怎么办 捡到苹果手机打不开怎么办 捡到指纹手机打不开怎么办 捡到手机密码打不开怎么办 遇到假苹果售后怎么办 做微商被骗囤货怎么办 代理如果不做了怎么办 微商加盟费不退怎么办 手机背面发霉了怎么办