跳转链接:Java 线程池的使用【一】【Executor】
跳转链接:Java 线程池的使用【二】【ThreadPoolExecutor 】
一、使用Executors创建四种线程池:
Executors类提供工厂方法用来创建不同类型的线程池,实际上Executors创建的四种线程底层的实现都是通过ThreadPoolExecutor实现的。
ExecutorService executorService = Executors.具体类型的线程池;
通过调用返回值ExecutorService类的submit方法,将具体执行的线程任务传入到线程池中并执行。
线程任务的创建:跳转链接(下面例子都以Runnable接口为例)。
1)newCachedThreadPool
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有60s未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.submit(new Runnable() {
@Override
public void run() {
System.out.println("newCachedThreadPool");
}
});
2)newFixedThreadPool
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数nThreads线程会处于处理任务的活跃状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新的线程将代替它执行后续的任务(如果需要)。在某个线程被显示地关闭之前,池中的线程将一直存在。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
System.out.println("newFixedThreadPool");
}
});
3)newSingleThreadExecutor
创建一个只有一个线程的线程池,这个线程池可以在线程死亡后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去。
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
singleThreadPool.submit(new Runnable() {
@Override
public void run() {
System.out.println("newSingleThreadExecutor");
}
});
4)newScheduledThreadPool
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);
scheduledThreadPool.submit(new Runnable() {
@Override
public void run() {
System.out.println("");
}
});
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("延迟三秒,只执行一次");
}
}, 3, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("延迟一秒后,每三秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
scheduledThreadPool.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("延迟一秒后,等当前任务执行完毕后,推迟三秒后再执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
总结:
- schedule方法是创建并执行在给定延迟后启用的一次性操作,只执行一次,第一个参数可以传入Callable接口或Runnable接口。
- scheduleAtFixedRate方法是固定的频率来执行某项计划,它不受每次计划执行时间的影响。到时间,它就执行;
- scheduleWithFixedDelay方法,是相对任务。即无论当前任务执行多长时间,等执行完了,我再延迟指定的时间后再执行下一次,它受计划执行时间的影响。
三、停止线程池:
shutdown()方法调用后,线程池不再接收新任务,并且会将线程池中所有的任务执行后自动停止。
shutdownNow()方法调用后,线程池会强制中断所有线程立即停止。
四、线程池的ThreadFactory:
ThreadFactory简单来说就是用来创建线程的,其中也只是有一个newthread方法。
一些常用的作用:
- 给线程命名,查看创建线程数
- 给线程设置是否是后台运行
- 设置线程优先级
1)创建ThreadFactory的实现(也可以直接使用匿名内部类的方式实现)
public class MyThreadFactory implements ThreadFactory{
private final boolean isDaemon;
MyThreadFactory(boolean isDaemon){
this.isDaemon = isDaemon;
}
@Override
public Thread newThread(Runnable r) {
Thread newThread = new Thread(r);
newThread.setDaemon(isDaemon);
return newThread;
}
}
2)将ThreadFactory传入线程池:
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3,
new MyThreadFactory(true));
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println("");
}
});
}



