您的位置:首页 > 其它

四种线程池的使用

2016-07-18 22:05 302 查看
线程池是一种对象池,目的是减小对象的创建和注销的开支,减轻JVM的压力

为什么使用线程池
newThread 有很多弊端
1 新建对象性能差
2 线程之间缺乏统一管理,可能无限的创建线程,相互之间的竞争会带来过多系统的损耗,导致死机或者oom;
3 缺乏更多的功能,例如  定时执行 定期执行 线程中断 可以基本理解为线程池扩展了很多新功能。

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

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

创建一个可缓存的线程池
ExecutorService CachedPool = Executors.newCachedThreadPool();
for (int i =0;i<1000;i++){
final  int index = i;

1:    //给线程池添加任务
CachedPool.execute(new Runnable() {
@Override
public void run() {
//try {
Thread.sleep(index *1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("打印编号",""+index);
}
});
}

2:    // newFixedThreadPool
//创建一个定长的线程池,可控制线程的最大并发数,超出的线程会在排列等待
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1000);
for (int i =0;i<1000;i++){
final  int index = i;

fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(index*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("打印数据",""+ index);
}
});
}

3:  //单线程线程池
//newSingleThreadPool
ExecutorService singlePool = Executors.newSingleThreadExecutor();
for (int i =0;i<10;i++){
final int index = i;
singlePool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
Log.i("数据打印",""+ index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

4:   //scheduledThreadPool
//创建一个定长的线程池,支持定期和定时的任务执行 ... 参数是最大线程数

ScheduledExecutorService schemePool = Executors.newScheduledThreadPool(5);
//延时操作
//参数1 :操作的任务        参数2 :要延迟的时间          参数3:延迟的时间的单位
schemePool.schedule(new Runnable() {
@Override
public void run() {
Log.i("打印","任务执行完毕");
}
},3, TimeUnit.SECONDS);

//定时周期性的任务
//参数1:要执行的任务    参数2:延迟多长时间      参数3:周期时间(每隔多长时间触发一次)    参数4:时间的单位
schemePool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Log.i("打印","我在执行");
}
},1,5,TimeUnit.SECONDS);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: