Java中的异步与线程池解读
什么是异步?
异步是指一个方法调用不会阻塞当前线程,而是立即返回,然后在另一个线程上执行。由于异步方法不会阻塞当前线程,所以可以提高系统的并发能力,避免系统因等待I/O等操作而造成的阻塞。
在Java中,异步通常是指使用线程池来执行一些耗时的任务。Java 5引入了java.util.concurrent包,其中提供的Excutor框架提供线程池的实现。
什么是线程池?
线程池是一种重用线程的机制,当一个任务到达时,线程池就将一个线程分配给这个任务,并执行该任务。当任务完成后,线程并不会被销毁,而是被放回线程池中,等待下一个任务的到来。这样可以避免创建和销毁线程的开销,提高系统的性能和响应速度。
Java中的线程池分为三种:FixedThreadPool、CachedThreadPool和ScheduledThreadPool。
FixedThreadPool
FixedThreadPool是指线程数量固定的线程池。在初始化时,会创建指定数量的线程,且这些线程将一直存在,直到线程池被关闭。如果有新的任务提交,但是线程池没有空闲线程可用,则该任务将会被阻塞等待。
示例:
// 创建一个FixedThreadPool,线程数量为5
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交10个任务
for (int i = 1; i <= 10; i++) {
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务");
Thread.sleep(1000);
});
}
// 关闭线程池
executorService.shutdown();
执行结果:
pool-1-thread-2执行任务
pool-1-thread-5执行任务
pool-1-thread-4执行任务
pool-1-thread-1执行任务
pool-1-thread-3执行任务
pool-1-thread-2执行任务
pool-1-thread-4执行任务
pool-1-thread-1执行任务
pool-1-thread-5执行任务
pool-1-thread-3执行任务
从结果可以看出,线程数量固定,线程一共执行了10个任务。
CachedThreadPool
CachedThreadPool是指线程数量不固定的线程池。在提交任务时,如果有空闲线程可用,则用一个空闲线程执行该任务;如果没有空闲线程,则创建一个新的线程执行该任务。当一个线程空闲时间超过60秒,则将被回收。
示例:
// 创建一个CachedThreadPool
ExecutorService executorService = Executors.newCachedThreadPool();
// 提交10个任务
for (int i = 1; i <= 10; i++) {
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务");
Thread.sleep(1000);
});
}
// 关闭线程池
executorService.shutdown();
执行结果:
pool-1-thread-1执行任务
pool-1-thread-2执行任务
pool-1-thread-5执行任务
pool-1-thread-3执行任务
pool-1-thread-4执行任务
pool-1-thread-6执行任务
pool-1-thread-7执行任务
pool-1-thread-2执行任务
pool-1-thread-8执行任务
pool-1-thread-9执行任务
从结果可以看出,线程数量不固定,根据实际情况动态创建和回收线程。
ScheduledThreadPool
ScheduledThreadPool是指定时执行任务的线程池。可以按照固定的延时或固定的周期执行任务。
示例:
// 创建一个ScheduledThreadPool
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
// 延时3秒执行任务
scheduledExecutorService.schedule(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务1");
}, 3, TimeUnit.SECONDS);
// 延时2秒后,以1秒的周期执行任务
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务2");
}, 2, 1, TimeUnit.SECONDS);
// 关闭线程池
scheduledExecutorService.shutdown();
执行结果:
pool-1-thread-1执行任务1
pool-1-thread-5执行任务2
pool-1-thread-2执行任务2
pool-1-thread-3执行任务2
pool-1-thread-1执行任务2
pool-1-thread-4执行任务2
总结
Java中的线程池是提高系统并发能力的重要工具,可以避免创建和销毁线程的开销,提高系统的性能和响应速度。在实际开发中,需要根据实际需求选择合适的线程池类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的异步与线程池解读 - Python技术站