Java线程池示例

1.FixedThreadPool

定长线程池,只会根据初始设置创建定长的线程数,当有新的任务时,有空闲线程则执行任务,没有空闲线程则加入队列,等待工作线程执行完成。

public class FixedThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 1; i <= 20; i++) {
            final int temp = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        // 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
        executorService.shutdown();
    }

}

2.CachedThreadPool

线程池为无限大,当有新的任务时,会看是否有空闲线程,有则使用空闲线程,而不再创建新线程;如果没有空闲线程,则会创建一个新的线程执行任务。

public class CachedThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 1; i <= 20; i++) {
            final int temp = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
                }
            });
        }
        // 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
        executorService.shutdown();
    }

}

3.SingleThreadExecutor

创建唯一的工作线程来执行任务,如果线程异常结束,会有另一个线程取代它,相当于单线程。

public class SingleThreadExecutorDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 1; i <= 20; i++) {
            final int temp = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
                }
            });
        }
        // 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
        executorService.shutdown();
    }

}

4.ScheduledThreadPool

定时或者周期性的工作调度。

public class ScheduledThreadPoolDemo {

    public static void main(String[] args) {
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
        for (int i = 1; i <= 20; i++) {
            final int temp = i;
            executorService.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
                }
            }, 3, TimeUnit.SECONDS);
        }
        // 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
        executorService.shutdown();
    }

}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容