有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程在java中并发性和并行性之间有区别吗?

我一直在谷歌做一些研究,我不能完全理解java中并发程序和并行程序之间的差异(如果有的话)。我所看到的一些信息表明两者没有区别。是这样吗


共 (6) 个答案

  1. # 1 楼答案

    并行化(或并行或并行计算)是一种同时执行许多计算的计算形式。本质上,如果CPU密集型问题可以划分为更小、独立的任务,那么这些任务可以分配给不同的处理器

    并发性更多地是关于多任务处理,它执行许多操作,但不是CPU密集型问题所必需的

  2. # 2 楼答案

    我想这取决于你的定义,但我的理解大致如下:

    • 并发性指以某种未指定顺序发生的事情。多任务处理——通过时间切片交错指令来执行多个程序——是思考这种并发性的好方法
    • 并行性(或“真正的”并行性)指的是在同一时间发生的事情。这需要硬件支持(协处理器、多核处理器、联网机器等)。所有并行都是并行的,但并非所有并行都是并行的

    据我所知,这两个术语都不是特定于Java的,也没有任何特定于Java的细微差别

  3. # 3 楼答案

    我认为这两个术语没有明确的不同含义。它们都是艺术术语而不是技术术语

    也就是说,我对它们的解释是,如果某件事情可以与其他事情同时完成,那么它是并发的,如果它可以由多个线程同时完成,那么它是并行的。我主要从JVM garbage collection documentation中获取这个用法,它表示

    The concurrent mark sweep collector, also known as the concurrent collector or CMS, is targeted at applications that are sensitive to garbage collection pauses. It performs most garbage collection activity concurrently, i.e., while the application threads are running

    CMS collector now uses multiple threads to perform the concurrent marking task in parallel on platforms with multiple processors.

    诚然,这是一个非常具体的背景,从中概括可能是不明智的

  4. # 4 楼答案

    从oracle文档page

    在单处理器上的多线程进程中,处理器可以在线程之间切换执行资源,从而导致并发执行

    共享内存多处理器环境中的同一个多线程进程中,进程中的每个线程可以同时在单独的处理器上运行,从而导致并行执行

    当进程的线程数少于或等于处理器数时,线程支持系统与操作环境一起确保每个线程在不同的处理器上运行

    JavaSE7通过添加ForkJoinPoolAPI进一步增强了并行处理

    有关更多详细信息,请参阅以下帖子:

    Parallel programming with threads in Java(特定于Java)

    Concurrency vs Parallelism - What is the difference?(语言不可知论)

  5. # 5 楼答案

    如果您使用线程(并发编程)进行编程,那么它不一定会这样执行(并行执行),因为这取决于机器是否能够处理多个线程

    这是一个直观的例子。非螺纹机器上的螺纹:

             --  --  --
          /              \
     >---- --  --  --  -- ---->>
    

    螺纹机上的螺纹:

           ------
          /      \
      >-------------->>
    

    破折号表示已执行的代码。如您所见,它们都被拆分并分别执行,但是线程机可以同时执行多个单独的部分

    请参阅此What is the difference between concurrent programming and parallel programming?

  6. # 6 楼答案

    这取决于谁在定义它。创建Go编程语言的人call code Concurrent如果它被分解成多个部分,可以被并行处理,而并行意味着这些部分实际上是同时运行的

    由于这些都是编程原则,编程语言与它们的定义方式无关。然而,Java8将有更多的特性来支持并发性和并行性,而不会使代码过于混乱。例如,代码如下所示:

    List<Integer> coolItemIds = new List<Integer>();
    for(Item item : getItems())
    {
        if(item.isCool())
        {
            int itemId = item.getId();
            coolItemIds.add(item);
        }
    }
    

    。。。它是非并发和非并行的,可以这样写(我的语法可能是错误的,但希望你能理解):

    Iterable<Item> items = getItems();
    Iterable<Item> coolItems = items.filter(item -> item.isCool());
    Iterable<Integer> coolItemIds = coolItems.map(item -> item.getId());
    

    上面的代码是以并发方式编写的:给定的代码都不要求一次过滤一个coolItems,或者一次只能对一个项目调用getId(),甚至列表开头的项目也不需要在末尾的项目之前过滤或映射。根据从getItems()返回的Iterable的类型,给定的操作可以并行运行,也可以不并行运行,但是您编写的代码是并发的

    还值得注意的是: