有 Java 编程相关的问题?

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

多线程Java:线程技术与概念

当使用线程时,我有时会将它们想象成在空间环境中编织在一起的物体之间的3维或更多维的互连。这不是一个通用的用例场景,但对于我所做的事情来说,这是一个考虑它的有用方法

您是否使用了一些API来帮助线程

您是否以一种不将线程概念化为进程的方式使用线程


共 (4) 个答案

  1. # 1 楼答案

    When using threads I sometimes visualise them as weaving together 3 or more dimensional interconnections between Objects in a Spatial context.

    这听起来确实很复杂,例如,您将如何概念化600个线程?为什么不把它们看作是同时运行的多个执行线程呢

    Are there any APIs which you use which aid threading?

    我建议最简单、最直接的方法是你能找到的第一个匹配项http://www.google.co.uk/search?q=java+threads

    Have you used threads in a manner which doesn't conceptualise as thread being a process?

    由于线程不是进程,我不能说我曾经认为线程是进程。(除旧版本的Linux外)进程一开始默认不共享内存/对象,它们完全独立运行(通常是不同的程序,可能用不同的语言编写),它们也使用不同的API以不同的方式启动

    有一种观点认为多线程是复杂的。事实上,我会说相反的话。多线程编程要求您使代码简单、易于理解,并且能够直接进行推理。虽然这需要经验,但你的目标是简单

  2. # 2 楼答案

    首先

    通常的免责声明:在任何语言中,使用任何抽象级别的并发编程都是困难的复杂的,并且有很多风险。考虑到:

    • 并发编程在很大程度上使任何应用程序复杂化
    • 单元测试关键部分很难,有时甚至不可能
    • 复制源自并发代码的bug非常困难,并且很大程度上取决于体系结构、操作系统风格、版本等

    Java并发API

    Java在使开发人员尽可能容易地进行并发编程方面已经走了很长的路。对于大多数情况,您将看到java.util.concurrent具有您需要的大多数抽象:

    • 可以扩展的接口和对象。只要输入代码,就可以运行线程了
    • 一组很好的Executors:常量池、动态池、计划池或其他。只要向它扔一个Runnable,它就会完成其余的工作
    • Semaphores各种锁可以让您无需实施常见的锁定技术
    • 所有对象的内置wait()notify()API

    使用

    作为软件工程师,您唯一需要做的就是确保您编写的代码是正确的。这意味着你应该意识到你可能面临的危险情况:

    • 死锁-两个或多个线程等待无序资源的情况,导致无限等待循环
    • Livelock-两个或多个线程礼貌地试图让位于共享资源上的另一个线程,但最终没有占用该资源(考虑走廊中的两个人走向对方,并不断地从一边移动到另一边)
    • 饥饿-单个线程占用单个共享资源的大部分或全部,从而剥夺其他线程对其的访问权

    要点(或何时使用)

    仅当并发将直接改善应用程序行为时才使用线程

    如果您正在等待IO/网络/硬件绑定资源,DO在其上生成一个线程,以便继续执行其他任务

    如果您只是尝试优雅地分割CPU限制的计算,不要使用线程。你最终可能会让你的表现恶化

    如果您确实使用了线程,请确保您已经彻底考虑了风险,并再次检查您是否错过了任何异常情况

    有用的(在线)资源

    进入事物的最快方式是做Sun concurrency tutorial。除此之外,买一本好书

    祝你好运:)

  3. # 3 楼答案

    并发性是一个需要涵盖的深刻而复杂的主题。像Java Concurrency in Practice这样的书可能会有所帮助

    有关线程的API,请参见Concurrency Utilities Overview^例如,{a3}可能很有用

    A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

    CountDownLatch

    A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

    还有一些有趣的行为

    A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

    编辑: 我现在正在实践中阅读Java并发。非常好

  4. # 4 楼答案

    您是否使用了任何API来帮助线程

    你是说从java.util.concurrent来的公寓FunctionalJava得到了一些有助于并发编程的结构,如启动here的多部分教程中所述

    您是否以不将线程概念化为进程的方式使用线程

    是的,在某种程度上线程根本没有概念化。以异步任务运行程序为例。它在封面下使用线,但我看不到它们,也不在乎它们。它们完全由任务运行者管理

    在封面下,这一切都只是线程,但当我们不再关心单个线程,而只是把它们看作一系列插槽,在这些插槽中,您可以以某种方式放入代码并让其运行一段时间,那么这就是我们开始达到更高抽象级别的时候了

    代理/参与者是一种常见的方法。一个参与者就像一个线程,它有一个状态块,然后你可以给它发送一些代码,并说“有时间的时候把它发送到你的状态”或者类似的话