多线程Java:线程技术与概念 2 年,1 月 Questions & Answers 3265 当使用线程时,我有时会将它们想象成在空间环境中编织在一起的物体之间的3维或更多维的互连。这不是一个通用的用例场景,但对于我所做的事情来说,这是一个考虑它的有用方法 您是否使用了一些API来帮助线程 您是否以一种不将线程概念化为进程的方式使用线程
# 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 楼答案 首先 通常的免责声明:在任何语言中,使用任何抽象级别的并发编程都是困难的和复杂的,并且有很多风险。考虑到: 并发编程在很大程度上使任何应用程序复杂化 单元测试关键部分很难,有时甚至不可能 复制源自并发代码的bug非常困难,并且很大程度上取决于体系结构、操作系统风格、版本等李> Java并发API Java在使开发人员尽可能容易地进行并发编程方面已经走了很长的路。对于大多数情况,您将看到java.util.concurrent具有您需要的大多数抽象: 可以扩展的接口和对象。只要输入代码,就可以运行线程了 一组很好的Executors:常量池、动态池、计划池或其他。只要向它扔一个Runnable,它就会完成其余的工作李> Semaphores和各种锁可以让您无需实施常见的锁定技术李> 所有对象的内置wait()和notify()API李> 使用 作为软件工程师,您唯一需要做的就是确保您编写的代码是正确的。这意味着你应该意识到你可能面临的危险情况: 死锁-两个或多个线程等待无序资源的情况,导致无限等待循环李> Livelock-两个或多个线程礼貌地试图让位于共享资源上的另一个线程,但最终没有占用该资源(考虑走廊中的两个人走向对方,并不断地从一边移动到另一边) 饥饿-单个线程占用单个共享资源的大部分或全部,从而剥夺其他线程对其的访问权李> 要点(或何时使用) 仅当并发将直接改善应用程序行为时才使用线程强> 如果您正在等待IO/网络/硬件绑定资源,DO在其上生成一个线程,以便继续执行其他任务 如果您只是尝试优雅地分割CPU限制的计算,不要使用线程。你最终可能会让你的表现恶化 如果您确实使用了线程,请确保您已经彻底考虑了风险,并再次检查您是否错过了任何异常情况 有用的(在线)资源 进入事物的最快方式是做Sun concurrency tutorial。除此之外,买一本好书 祝你好运:)
# 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 楼答案 您是否使用了任何API来帮助线程强> 你是说从java.util.concurrent来的公寓FunctionalJava得到了一些有助于并发编程的结构,如启动here的多部分教程中所述 您是否以不将线程概念化为进程的方式使用线程强> 是的,在某种程度上线程根本没有概念化。以异步任务运行程序为例。它在封面下使用线,但我看不到它们,也不在乎它们。它们完全由任务运行者管理 在封面下,这一切都只是线程,但当我们不再关心单个线程,而只是把它们看作一系列插槽,在这些插槽中,您可以以某种方式放入代码并让其运行一段时间,那么这就是我们开始达到更高抽象级别的时候了 代理/参与者是一种常见的方法。一个参与者就像一个线程,它有一个状态块,然后你可以给它发送一些代码,并说“有时间的时候把它发送到你的状态”或者类似的话
# 1 楼答案
这听起来确实很复杂,例如,您将如何概念化600个线程?为什么不把它们看作是同时运行的多个执行线程呢
我建议最简单、最直接的方法是你能找到的第一个匹配项http://www.google.co.uk/search?q=java+threads
由于线程不是进程,我不能说我曾经认为线程是进程。(除旧版本的Linux外)进程一开始默认不共享内存/对象,它们完全独立运行(通常是不同的程序,可能用不同的语言编写),它们也使用不同的API以不同的方式启动
有一种观点认为多线程是复杂的。事实上,我会说相反的话。多线程编程要求您使代码简单、易于理解,并且能够直接进行推理。虽然这需要经验,但你的目标是简单
# 2 楼答案
首先
通常的免责声明:在任何语言中,使用任何抽象级别的并发编程都是困难的和复杂的,并且有很多风险。考虑到:
Java并发API
Java在使开发人员尽可能容易地进行并发编程方面已经走了很长的路。对于大多数情况,您将看到
java.util.concurrent
具有您需要的大多数抽象:Executors
:常量池、动态池、计划池或其他。只要向它扔一个Runnable
,它就会完成其余的工作李>Semaphore
s和各种锁可以让您无需实施常见的锁定技术李>wait()
和notify()
API李>使用
作为软件工程师,您唯一需要做的就是确保您编写的代码是正确的。这意味着你应该意识到你可能面临的危险情况:
要点(或何时使用)
仅当并发将直接改善应用程序行为时才使用线程强>
如果您正在等待IO/网络/硬件绑定资源,DO在其上生成一个线程,以便继续执行其他任务
如果您只是尝试优雅地分割CPU限制的计算,不要使用线程。你最终可能会让你的表现恶化
如果您确实使用了线程,请确保您已经彻底考虑了风险,并再次检查您是否错过了任何异常情况
有用的(在线)资源
进入事物的最快方式是做Sun concurrency tutorial。除此之外,买一本好书
祝你好运:)
# 3 楼答案
并发性是一个需要涵盖的深刻而复杂的主题。像Java Concurrency in Practice这样的书可能会有所帮助
有关线程的API,请参见Concurrency Utilities Overview^例如,{a3}可能很有用
见CountDownLatch
还有一些有趣的行为
编辑: 我现在正在实践中阅读Java并发。非常好
# 4 楼答案
您是否使用了任何API来帮助线程强>
你是说从
java.util.concurrent
来的公寓FunctionalJava得到了一些有助于并发编程的结构,如启动here的多部分教程中所述您是否以不将线程概念化为进程的方式使用线程强>
是的,在某种程度上线程根本没有概念化。以异步任务运行程序为例。它在封面下使用线,但我看不到它们,也不在乎它们。它们完全由任务运行者管理
在封面下,这一切都只是线程,但当我们不再关心单个线程,而只是把它们看作一系列插槽,在这些插槽中,您可以以某种方式放入代码并让其运行一段时间,那么这就是我们开始达到更高抽象级别的时候了
代理/参与者是一种常见的方法。一个参与者就像一个线程,它有一个状态块,然后你可以给它发送一些代码,并说“有时间的时候把它发送到你的状态”或者类似的话