欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

高并发多线程——线程池

时间:2023-07-11

在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。、

Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

线程池提供了一个线程队列,队列中保存着所有等待状态的线程;

避免了创建与销毁线程的额外开销,提高了响应速度;

线程池的体系结构

java.util.concurrent.Executor: 负责线程的使用和调度的根接口;ExecutorService: 子接口,线程池的主要接口;ThreadPoolExecutor: 线程池的实现类;ScheduledExecutorService: 子接口,负责线程的调度;ScheduledThreadPoolExecutor: 继承了线程池的实现类,实现了负责线程调度的子接口;

工具类:

Executors

ExecutorService newFixedThreadPool(): 创建固定大小的线程池;ExecutorService newCachedThreadPool(): 缓存线程池,线程池中线程的数量不固定,可以根据需求自动更改数量;ExecutorService newSingleThreadExecutor(): 创建单个线程池, 线程池中只有一个线程;ScheduledExecutorService newScheduledThreadPool(): 创建固定大小的线程,可以延时或定时的执行任务;

public class TestThreadPool{public static void main(String[] args){ // 1、创建线程池 ExecutorService pool = Executors.newFixedThreadPool(5); ThreadPoolDemo tpd = new ThreadPoolDemo(); // 2、为线程池中线程分配任务 // submit(Callable task) // submit(Runnable task) for(int i=0; i<10; i++){ pool.submit(tpd); } // 3、关闭线程池 pool.shutdown(); }} class ThreadPoolDemo implements Runnable{ private int i=0; public void run(){ while(i <= 100){ System.out.println(Thread.currentThread().getName()+" : "+ i++) } }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。