首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

Java 并发与多线程教程

2020-01-23

注:此文翻译自 Java Concurrency and Multithreading Tutorial ,本文仅仅首篇翻译

Java 中的*并发*是一个术语,触及 Java 渠道中的多线程、并发、并行等概念。包含 Java 并发东西,问题和处理方案。这个教程涵盖了多线程的中心概念、并发组成结构、并发的问题、本钱与收益以及与 Java 多线程相关的问题。

多线程的意思是在同一个运用中有多个*履行线程*。线程就比如是你运用中的一个独立的 CPU。因而多线程的运用就比如一个具有多个 CPU 的运用程序,这些 CPU 能够在同一时刻履行不同的代码。

虽然一个线程并不等同于一个 CPU,可是一般一个 CPU 将会同享履行时刻给多个线程,CPU 会在不同的线程之间来回切换,每个线程上履行一点。当然让运用中的线程履行在不同的 CPU 上也是能够的。

咱们需运用多线程的原因有许多,最重要的有以下几点:

下面的章节中我将逐个解说这几个原因的细节。

最常见的原因之一是能够更好有利地势用计算机中的资源,比如说,一个线程正在等候一个网络恳求呼应的一起,另一个线程能够运用 CPU 做其他工作。其他,假如计算机有多个 CPU 或许 CPU 有多个履行内核,那么多线程相同能够帮你更好的运用这些 CPU 内核。

假如计算机有多个 CPU 或许 CPU 有多个履行内核,那么你需求在运用中运用多线程来更好的运用到一切的 CPU 和多核 CPU。单个线程最多只能运用一个 CPU,就像我上面说到的,有时乃至不能彻底有利地势用好一个 CPU。

其他一个运用多线程的原因是供给杰出的用户体会。比如说,当你点击了一个 GUI 界面上的按钮,这个动作会触发一个网络恳求,接着哪个线程来处理这个恳求就十分要害了。假如你一起又运用这个处理恳求的线程来更新 GUI 界面,然后当 GUI 线程等候恳求呼应时用户就会体会到 GUI *挂起*的状况。作为代替方案,这个处理恳求的线程能够独自创建成后台线程,这样的话 GUI 线程就能够用来一起呼应其它恳求。

第四个原因是在用户之间更公正的同享资源,幻想一个比如,服务器接纳客户端的恳求,可是只要一个线程来处理这些恳求。假如有一个客户端发送了一个恳求而且处理了好久,然后其它客户端恳求不得不等候那个恳求完毕。让每个恳求都有一个归于自己的处理线程去履行,这样的话就不会有任何一个使命能够彻底地强占 CPU。

曾经的计算机只要一个 CPU,而且在同一时刻只能履行一个程序。许多的小型计算机并没有强壮到能在同一时刻履行多个程序,也没有尝试过这么规划。坦白地说,许多主机系统能够在同一时刻履行多使命这比个人电脑现已提早好多年了。

后来多使命呈现了,这意味着计算机能够一起履行多个程序,这才真实意义上叫做一起履行。CPU 在多个程序之间被同享。操作系统在运转的程序中来回切换,每次履行一小会儿。

跟着多使命处理给软件开发人员带来了新的应战,程序不再假定 CPU 一向可用,其它如内存这样的计算机资源也相同。好的程序员会在不运用资源的时分开释它们,这样其他程序才能够运用到这些资源。

后来又呈现了多线程。这意味着在程序内部你能够有多个履行线程。履行线程能够幻想成 CPU 履行程序。当你有多个线程履行同一个程序时,就比如多个 CPU 在同一个程序中履行。

关于某些程序而言,多线程是一个十分好的提高功能的方法。可是多线程的运用相关于多使命来说具有更高的应战。多个线程在同一个程序中履行,因而能够一起读取和写入相同的内存。这或许会导致一些单线程运用中不存在的问题。这些问题在单 CPU 的机器上或许不会被发现,由于 两个线程永久不或许真实地一起履行 。虽然如此,现代计算机能够具有多核CPU,或许多个 CPU。这意味着不同的线程能够在不同中心的 CPU 上被一起履行。

假如没有适宜的预防措施,这些问题就很或许会呈现。程序行为乃至不能被猜测。成果或许频频地改动。因而关于程序员来说做好预防措施就变得十分重要—意味着需求去学习线程是怎么拜访到同享资源的,这也是一个本教程要讲到的主题。

Java 是首个把多线程处理特性供给给开发者的编程言语之一。Java 在最开端的时分就供给了多线程处理的才能。因而 Java 程序员常常面对上面咱们说到的问题。这也是我写这篇文章的初衷,做为我自己的学习记载的一起也期望其它 Java 程序员能从中获益。

本教程将首要重视 Java 中的多线程处理。可是有的多线程问题与分布式系统中多使命处理面对的问题很类似。所以教程中也会呈现多使命与分布式系统的相关引证,因而教程运用「并发」而不是「多线程」这个要害字。

第一种*并发模型*假定多个线程在同一个程序中履行并能够同享目标。这种并发模型被称做「同享状况的并发模型」,有许多并发言语的组件构成都支撑这种并发模型。

可是,自从第一本 Java 并发书被写出以来并发构架规划现已发生了许多改变,乃至是从 Java 5并发东西包发布以来,并发构架规划也阅历了许多的改变。

同享状况的并发模型会引发许多难以处理的并发问题,因而,其他一种被叫做「无同享/状况别离」的并发模型流行了起来。在状况别离的并发模型中线程之间不同享任何目标或数据。这样就能够防止许多在同享并发模型中的并发拜访类题。

最新的如 Netty, Vert.x 和 Play,Akka, Qbit 等异步「状况别离」渠道套件渐渐锋芒毕露。新的非堵塞并发算法也现已发布,新的非堵塞东西像 LMax Disrupter 也被加进了套件中。Java 7 中的 Fork 和 Join 结构也引入了新的函数式编程并行特性。

跟着技能的不断发展,也是时分更新下这篇教程了。因而这篇教程再一次进入了 重写 状况。新的教程会在适宜的时刻发布。

假如你对 Java 并发还不是很了解,我主张你按下面的学习方案。你能够在左边的菜单中找到一切主题的链接。

通用的并发与多线程理论:

Java 并发根底:

Java 并发中的经典问题:

Java 中用来处理上面问题并发系统:

更多主题:

热门文章

随机推荐

推荐文章