方法名称
public static Executorservice newFixedThreadPool(int nThread) 创建固定线程数量的线程池,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程代替它
public satic ExecutorService newCachedthreadPool() 线程数量随着任务增加而增加,如果线程执行完毕却空闲了一段时间则会被回收
public static ExecutorService newsSingleThreadExecutor() 创建只有一个线程的线程池对象,如果该线程出现异常而结束,那么线程池会补充一个线程
public satic ScheduleExecutorService newScheduledThreadPool(int corePoolSize) 创建一个线程池,可以实现在给定的延时后运行任务,或者定期执行任务、
注意:Executors的底层也是基于线程池的实现类ThreadPoolExecutor创建线程池对象的
package domeExecutor;
public class MyThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"输出");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package domeExecutor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService pool=Executors.newFixedThreadPool(3);
pool.execute(new MyThread());
pool.execute(new MyThread());
pool.execute(new MyThread());
//如果前面3个线程被占用,将不会后面的
pool.execute(new MyThread());
}
}
Executors返回的线程池对象弊端如下:
FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量请求,从而导致OOM
CachedThreadPool和ScheduleThreadPool:允许的线程数量为:Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM
Executors是否适合做大型互联网场景的线程池方案?
不适合
建议使用ThreadPoolExecutor来指定线程池参数,这样可以明确线程池运行规则,避免资源耗尽的风险