欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
本文由 ImportNew - 一杯哈希不加盐 翻译自 stackify。接待插手翻译小组。转载请见文末要求。

 private BigInte  <a href=苏州软件定制开拓 ger calculate(int start" class="aligncenter size-full wp-image-29214" title="1" src="/uploads/allimg/c180729/1532PQ426320-12C6.png" />

线程池是多线程编程中的焦点观念,简朴来说就是一组可以执行任务的空闲线程。

首先,我们相识一下多线程框架模子,大白为什么需要线程池。

线程是在一个历程中可以执行一系列指令的执行情况,或称运行措施。多线程编程指的是用多个线程并行执行多个任务。虽然,JVM 对多线程有精采的支持。

尽量这带来了诸多优势,首当其冲的就是措施机能提高,但多线程编程也有缺点 —— 增加了代码巨大度、同步问题、非预期功效和增加建设线程的开销。

在这篇文章中,我们来相识一下如何利用 Java 线程池来缓解这些问题。

为什么利用线程池?

建设并开启一个线程开销很大。假如我们每次需要执行任务时反复这个步调,那将会是一笔庞大的机能开销,这也是我们但愿通过多线程办理的问题。

为了更好领略建设和开启一个线程的开销,让我们来看一看 JVM 在靠山做了哪些事:

  • 为线程栈分派内存,生存每个线程要领挪用的栈帧。
  • 每个栈帧包罗当地变量数组、返回值、操纵栈和常量池
  • 一些 JVM 支持当处所法,也将分派当处所法栈
  • 每个线程得到一个措施计数器,标识处理惩罚器正在执行哪条指令
  • 系统建设当地线程,昆山软件开发,与 Java 线程对应
  • 和线程相关的描写符被添加到 JVM 内部数据布局
  • 线程共享堆和要领区
  • 虽然,这些步调的详细细节取决于 JVM 和操纵系统。

    别的,更多的线程意味着更多事情量,系统需要调治和抉择哪个线程接下来可以会见资源。

    线程池通过淘汰需要的线程数量并打点线程生命周期,来辅佐我们缓解机能问题。

    本质上,线程在我们利用前一直生存在线程池中,在执行完任务之后,线程会返回线程池期待下次利用。这种机制在执行许多小任务的系统中十分有用。

    Java 线程池

    Java 通过 executor 工具来实现本身的线程池模子。可以利用 executor 接口或其他线程池的实现,它们都答允细粒度的节制。

    java.util.concurrent 包中有以下接口:

  • Executor —— 执行任务的简朴接口
  • ExecutorService —— 一个较巨大的接口,包括特别要领来打点任务和 executor 自己
  • ScheduledExecutorService —— 扩展自 ExecutorService,增加了执行任务的调治要领
  • 除了这些接口,这个包中也提供了 Executors 类直接获取实现了这些接口的 executor 实例

    一般来说,一个 Java 线程池包括以下部门:

  • 事情线程的池子,认真打点线程
  • 线程工场,认真建设新线程
  • 期待执行的任务行列
  • 在下面的章节,让我们仔细看一看 Java 类和接口如作甚线程池提供支持。

    Executors 类和 Executor 接口

    Executors 类包括工场要领建设差异范例的线程池,Executor 是个简朴的线程池接口,只有一个 execute() 要领。

    我们通过一个例子来团结利用这两个类(接口),首先建设一个单线程的线程池,昆山软件开发,然后用它执行一个简朴的语句:

    Executor executor = Executors.newSingleThreadExecutor();
    executor.execute(() -> System.out.println("Single thread pool test"));

    留意语句写成了 lambda 表达式,会被自动揣度成 Runnable 范例。

    假如有事情线程可用,execute() 要领将执行语句,不然就把 Runnable 任务放举办列,期待线程可用。

    根基上,executor 取代了显式建设和打点线程。

    Executors 类里的工场要领可以建设许多范例的线程池:

  • newSingleThreadExecutor():包括单个线程和无界行列的线程池,同一时间只能执行一个任务
  • newFixedThreadPool():包括牢靠命量线程并共享无界行列的线程池;当所有线程处于事情状态,有新任务提交时,任务在行列中期待,直到一个线程变为可用状态
  • newCachedThreadPool():只有需要时建设新线程的线程池
  • newWorkStealingThreadPool():基于事情窃取(work-stealing)算法的线程池,后头章节具体说明
  • 接下来,让我们看一下 ExecutorService 接口提供了哪些新成果

    ExecutorService

    建设 ExecutorService 方法之一即是通过 Excutors 类的工场要领。

    ExecutorService executor = Executors.newFixedThreadPool(10);

    Besides the execute() method, this interface also defines a similar submit() method that can return a Future object: