标签:工作 ace single eva override nbsp 结束 入队 hit
(1) 每次new Thread()耗费性能
(2) 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源,使系统瘫痪
(3) 不利于扩展,比如如定时执行、定期执行
(1) 重用存在的线程,减少对象创建、销毁的开销,性能佳
(2) 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
(3) 提供定时执行、定期执行、单线程、并发数控制等功能
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
executor.execute(task);
}
运行结果:可以看出缓存线程池大小是不定值,可以需要创建不同数量的线程,在使用缓存型池时,先查看池中有没有以前创建的线程,如果有,就复用.如果没有,就新建新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务。
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < 10; i++) {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
executor.execute(task);
}
运行结果:总共只会创建2个线程, 开始执行2个线程,当2个线程都处于活动状态,再次提交的任务都会加入队列等到其他线程运行结束,当线程处于空闲状态时会被下一个任务复用。
ExecutorService executor = Executors.newScheduledThreadPool(2);
for (int i = 0; i < 10; i++) {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
executor.schedule(task, 3, TimeUnit.SECONDS);
}
运行结果:和newFixedThreadPool类似,不同的是newScheduledThreadPool是延时指定时间之后才执行。
ExecutorService executor = Executors.newScheduledThreadPool();
for (int i = 0; i < 10; i++) {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
executor.execute(task);
}
运行结果:只会创建一个线程,当上一个执行完之后才会执行第二个。
相同点:submit和execute都是 ExecutorService 的方法,都是添加线程到线程池中
不同点:submit 有返回值 返回Future , execute没有,Future可以执行cancle方法(取消执行 ),可以通过get()方法,判断是否执行成功(null表示执行成功)
通过Executor来启动线程比用Thread的start()更好
标签:工作 ace single eva override nbsp 结束 入队 hit
原文地址:http://www.cnblogs.com/super-yu/p/7190280.html