Executors 与 Thread 比较

简介: Executors 与 Thread 比较

1. new Thread的弊端如下:


a. 每次new Thread新建对象性能差。

b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机。

c. 缺乏更多功能,如定时执行、定期执行、线程中断。


2. Executors 优势:


a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。

b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

c. 提供定时执行、定期执行、单线程、并发数控制等功能。


(1) . newCachedThreadPool


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


ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
}
});


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


(2) . newFixedThreadPool


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

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);


(3) newScheduledThreadPool


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


ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}


3, TimeUnit.SECONDS);  ///表示延迟3秒执行。


定期执行示例代码如下:


scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}


3, TimeUnit.SECONDS);


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


ScheduledExecutorService比Timer更安全,功能更强大:


以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只会创建一个线程,所以如果存在多个任务,且任务时间过长,超过了两个任务的间隔时间,会发生一些缺陷。


Timer timer = new Timer();    timer.schedule(task1, 1000);    timer.schedule(task2, 3000);  
对比: scheduledThreadPool.schedule(task1, 1000, TimeUnit.MILLISECONDS);   scheduledThreadPool.schedule(task2, 3000, TimeUnit.MILLISECONDS);


(4) newSingleThreadExecutor


创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO,优先级)执行,相当于顺序执行各个任务。


ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();


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


目录
相关文章
|
12月前
|
Java
Thread、Runnable、线程池
Thread是Java中的一个类,用于表示一个线程,它实现了Runnable接口。 通过创建Thread对象,可以创建并启动一个新的线程,执行指定的代码。
|
缓存 Java 编译器
Executors 正确使用的姿势是怎么样?
Executors 正确使用的姿势是怎么样?
96 0
ThreadPoolExecutor的中的submit和FutureTask || 通过Executors 创建线程池的一些实例(Callable和Runnable的在其中的体现)
ThreadPoolExecutor的中的submit和FutureTask || 通过Executors 创建线程池的一些实例(Callable和Runnable的在其中的体现)
186 0
|
Java
Thread.join与ThreadPool
1、Thread.join()    使用此方法先阻塞调用Thread的线程,确保线程Thread正常终止。     如果线程不终止,则调用方将无限期阻塞。如果调用 Join 时该线程已终止,此方法将立即返回。
1540 0
|
存储 Java 应用服务中间件
让人思来想去的ThreadPool
一直以来被一个线程池中核心线程跟非核心线程有什么区别的问题困惑着自己,是时候直面恐惧了。
175 0
|
消息中间件 Dubbo Java
“既生 ExecutorService, 何生 CompletionService?”
“既生 ExecutorService, 何生 CompletionService?”
“既生 ExecutorService, 何生 CompletionService?”
|
存储 缓存 监控
ThreadPoolExecutor:线程池不允许使用Executors创建
ThreadPoolExecutor:线程池不允许使用Executors创建
371 0
ThreadPoolExecutor:线程池不允许使用Executors创建
JUC - FutureTask(Runnable + Future)
JUC - FutureTask(Runnable + Future)
101 0
Thread和Runnable实现多线程(一)下
Thread和Runnable实现多线程(一)
119 0
Thread和Runnable实现多线程(一)下
Thread和Runnable实现多线程(一)上
实现多线程,有两种方式,一种是继承 Thread 类,一种是实现 Runnable接口。
192 0
Thread和Runnable实现多线程(一)上