首页 > 其他分享 >线程池

线程池

时间:2023-05-28 23:45:49浏览次数:36  
标签:场景 get 创建 任务 线程 执行

线程池的七大参数:

(1)核心线程数。

(2)最大线程数。

(3)非核心线程存活时间。

(4)非核心线程存活时间的单位。

(5)阻塞队列。

(6)线程工厂。

(7)拒绝策略。

拒绝策略有四种:

(1)由主线程执行这个任务。

(2)丢弃任务不报错。

(3)丢弃任务报错。(默认)

(4)丢弃最先进来的任务并尝试执行当前任务。

线程池执行任务的流程:

 

 执行execute()方法和submit()方法提交任务的区别:

  • execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;

  • submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用 get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。

线程池的4种类型:

(1)newFixedThreadPool:固定线程数的线程池,核心线程和最大线程数一样,没有救急线程。

适用场景:适用于任务量已知,相对耗时的场景。

(2)newSingleThreadExecutor:创建一个单线程的线程池,核心线程和最大线程数都是1。

适用场景:适合按顺序处理任务。

(3)newCachedThreadPool:创建一个可缓存的线程池,核心线程数为0,最大线程数为Integer.MAX_VALUE。特点:每来一个任务都会创建一个工作线程去执行任务。

适用场景:任务量比较密集,且每个任务执行时间不长。

(4)newScheduleThreadPool:支持定时以及周期性处理任务的线程池。

适用场景:有定时或周期性执行任务的场景。

线程池常用的阻塞队列:

 为什么不建议使用Executors创建线程池:

其实这个事情在阿里提供的最新开发手册《Java开发手册-嵩山版》中 也提到了 主要原因是如果使用Executors创建线程池的话,它允许的请求队列默认长度 是Integer.MAX_VALUE,这样的话,有可能导致堆积大量的请求,从而导致 OOM(内存溢出)。 所以,我们一般推荐使用ThreadPoolExecutor来创建线程池,这样可以明确 规定线程池的参数,避免资源的耗尽。

标签:场景,get,创建,任务,线程,执行
From: https://www.cnblogs.com/yhb-blogs/p/17439171.html

相关文章

  • Qt线程简单使用一:QThread~创建线程类子类
     需求:点击QPushButton按钮,QLabel中的数字,不断累加,一直到999。 做法:点击QPushButton后,启动线程,线程while循环,不断发送累加的数字回主线程,修改QLabel中的数字 其他:这种线程的写法是最简单的,全部是Qt封装好的,只需要重写run函数就可以了。 主要代码://......
  • Java 线程
    栈与栈帧JavaVirtualMachineStacks(Java虚拟机栈)每个线程启动后,虚拟机就会为其分配一块栈内存,是线程私有的。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存;每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。  线程上下文切换(ThreadContext......
  • 2023-05-28:为什么Redis单线程模型效率也能那么高?
    2023-05-28:为什么Redis单线程模型效率也能那么高?答案2023-05-28:1.C语言实现,效率高C语言程序运行速度快,因为其相较于其他高级语言更加接近底层机器。由于C语言直接操作内存,不会像其他语言那样依赖虚拟机或垃圾回收机制等中间层,从而能够实现更高的执行效率。2.单线程的优势Redi......
  • LockSupport与线程中断
    1LockSupport是什么LockSupport是用来创建锁和其他同步类的基本阻塞原语。park方法可以阻塞线程,unpark方法可以唤醒线程。与object的wait和notify不同的是,不需要synchonized的限制,没有先后顺序的限制。2线程中断线程不应该被其他线程中断,应该自己中断。线程的三个中断方法......
  • 2023-05-28:为什么Redis-单线程模型效率也能那么高?
    2023-05-28:为什么Redis-单线程模型效率也能那么高?答案2023-05-28:1.C语言实现,效率高C语言程序运行速度快,因为其相较于其他高级语言更加接近底层机器。由于C语言直接操作内存,不会像其他语言那样依赖虚拟机或垃圾回收机制等中间层,从而能够实现更高的执行效率。2.单线程的优势Redis采用......
  • 深入理解 Java 虚拟机 —— Java 内存模型与线程
    处理器的效率和一致性(与java内存访问可类比)计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处......
  • 新建T1,T2,T3线程,如何保证它们执行的顺序性
    在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。  ......
  • 线程的六种转态
    线程有六种状态:新建:当线程被创建时,还没有调用start()方法。可运行:调用start()方法后,等待CPU调度。阻塞:线程没有获取到锁进入阻塞状态。等待:线程获取到锁之后由于条件不满足调用wait()方法后释放锁进入等待状态,当其它持有锁的线程调用notify()或者notifyAll()方法才能唤醒该线程,进入可运......
  • python - 进程与线程 -2
    1.线程一个进程可以包含多个线程,一条线程就是进程中一个单一顺序的控制流。一个进程中可以并发多个线程,每条线程执行不同的任务。1.1使用Thread创建线程importthreadingimporttimedeftask():foriinrange(3):time.sleep(1)print(f"线程名:{th......
  • python - 进程与线程 -1
    多任务就是操作系统能同时执行多个程序,比如:看电影,聊天,查看网页。进程(process)是计算机中已经运行程序的实体,一个任务就是一个进程。1.使用multiprocessing模块创建进程1.1用Process类创建进程在这个模块中有一个Process类代表一个进程对象:Process(group=None,target=None,......