Java的线程池

  1. 何为进程?
    资源分配的最小单元,(资源包括:表格,内存空间,磁盘空间)同一进程中的多条线程讲共享该进程中的资源

  2. 何为线程
    CPU调度的最小单元,线程只有相关堆栈中的寄存器和线程控制表组成,而寄存器可被用来存储线程内的局部变量

  3. 线程安全是指什么?
    只有单例模式下共享全局变量才会导致线程不安全问题


  4. 分为隐式锁和显示锁;Synchronized是隐式锁,加在对象上的。显示锁:lock,需要手动开关,使用灵活

  5. Concurrent包
    1)原子性操作类,不需要Synchronized关键字,线程安全效率高
    2)线程队列,Java提供了一些线程安全的队列操作的类
    3)线程阀,控制线程的开始和结束

  6. 线程池
    1、解决频繁创建线程所产生的开销,减少创建和销毁线程所花的时间和资源消耗
    2、解决无限制的创建线程所引起的系统崩溃
    3、Executors提供了4种创建线程池的方法

ExcutorService pool = Excutors.newFixedThreadPool(5);//创建一个可重用固定线程数的线程池
#单任务线程池
ExcutorService pool = Excutors.newSingleThreadExcutor();
#可变尺寸的线程池
ExcutorService pool = Excutors.newCachedThreadExcutor();
#定时以及周期性执行任务的线程池
ScheduledThreadPoolExecutor exec = Executors.ScheduledThreadPoolExecutor(1);
        exec.scheduleAtFixedRate(new Runnable() {
                      publicvoid run() {
.....每隔一段时间就触发的线程内容
                      }
                  }, 1000, 5000,TimeUnit.MILLISECONDS);
  1. 线程池的理解(摘自网络)
    这里要重点解释一下corePoolSize、maximumPoolSize、largestPoolSize三个变量。
    corePoolSize在很多地方被翻译成核心池大小,其实我的理解这个就是线程池的大小。举个简单的例子:
      假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务。
      因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;
      当10个工人都有任务在做时,如果还来了任务,就把任务进行排队等待;
      如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招4个临时工人进来;
      然后就将任务也分配给这4个临时工人做;
      如果说着14个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。
      当这14个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的。
      这个例子中的corePoolSize就是10,而maximumPoolSize就是14(10+4)。
      也就是说corePoolSize就是线程池大小,maximumPoolSize在我看来是线程池的一种补救措施,即任务量突然过大时的一种补救措施。
      不过为了方便理解,在本文后面还是将corePoolSize翻译成核心池大小。
      largestPoolSize只是一个用来起记录作用的变量,用来记录线程池中曾经有过的最大线程数目,跟线程池的容量没有任何关系。

  2. 应用场景
    Servlet 我们java开发最基本的东西,其启动的时候其实是开辟了一个main线程的。而其中servlet类是单例的所以它是线程不安全的,但是在没有共享全局变量的情况,而reqest和response是一个请求是一个实例,而其本身的数据设计又是线程安全的。

    Tomcat Servlet的容器tomcat其实是对线程的线程池做了控制的。提高请求处理效率和避免请求太多把容器弄挂。

    Spring 默认加载bean的方式是单例的,所以其是线程不安全的。

    数据库连接池,其实也是多线程。

    nginx 前端网关请求,也是利用了线程池的原理。

    而我们的客户端ios,android其实也都是有主线程和子线程的说法,如果你能很好的将器里面的线程掌握基本上此种客户端开发就能掌握一半。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程池是一种用于管理和复用线程的机制,它可以提高多线程应用程序的性能和效率。线程池中的线程可以被重复使用,避免了频繁创建和销毁线程的开销。 在Java中,线程池可以通过`ExecutorService`接口来创建和管理。线程池中的线程可以执行提交给它的任务,并且可以根据需要自动创建新的线程或销毁闲置的线程。 嵌套线程池是指在一个线程池中创建另一个线程池。这种情况通常发生在需要处理一些复杂的任务,其中每个任务本身也需要使用线程池来执行。 下面是一个示例代码,演示了如何在Java中嵌套使用线程池: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NestedThreadPoolExample { public static void main(String[] args) { // 创建外层线程池 ExecutorService outerThreadPool = Executors.newFixedThreadPool(5); // 提交任务给外层线程池 outerThreadPool.execute(() -> { // 创建内层线程池 ExecutorService innerThreadPool = Executors.newFixedThreadPool(3); // 提交任务给内层线程池 innerThreadPool.execute(() -> { // 内层线程池执行的任务 System.out.println("Inner thread pool task executed"); }); // 关闭内层线程池 innerThreadPool.shutdown(); }); // 关闭外层线程池 outerThreadPool.shutdown(); } } ``` 在上面的示例中,我们首先创建了一个外层线程池`outerThreadPool`,它使用`Executors.newFixedThreadPool()`方法创建了一个固定大小的线程池。然后,我们向外层线程池提交了一个任务,该任务在执行时创建了一个内层线程池`innerThreadPool`,并向内层线程池提交了一个任务。最后,我们分别关闭了内层线程池和外层线程池

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值