Java:线程技术&概念

时间:2008-10-10 08:48:41

标签: java multithreading visualization

使用线程时,我有时会将它们视为将空间上下文中的对象之间的三维或更多维互连编织在一起。这不是一般用例场景,但对于我所做的事情,它是一种有用的思考方式。

您使用哪些API辅助线程化?

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

4 个答案:

答案 0 :(得分:14)

您使用哪些API辅助线程化?

你的意思是来自java.util.concurrent的appart? FunctionalJava得到了一些有助于并发编程的构造,如启动here的多部分教程中所述。

您是否以一种不将线程视为流程的方式使用线程?

是的,就线程根本没有概念化而言。以异步任务运行器为例。它使用了封面下的线程,但我没有看到它们,我也不关心它们。它们完全由任务运行员管理。

在幕后,它只是线程,但是当我们停止关注单个线程时,只需将它们视为多个插槽,您可以以某种方式放入代码并使其运行一段时间,然后那时我们开始达到更高的抽象水平。

代理/演员是执行此操作的常用方法。一个Actor就像一个有一块状态的线程,然后你就可以发送一些代码并说“当你有时间的时候对你的状态这么做”或者说是这样的。

答案 1 :(得分:8)

首先

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

  • 并发编程使任何应用程序变得复杂
  • 单元测试关键部分很难,有时甚至不可能
  • 重现源于并发代码的错误非常难以,并且在很大程度上依赖于体系结构,操作系统风格,版本等...

Java并发API

Java为开发人员提供尽可能简单的并发编程已经走了很长的路。对于大多数情况,您会看到java.util.concurrent具有您需要的大部分抽象:

    您可以扩展的
  • Runnable 界面和 Thread 对象。只需输入您的代码,您就可以运行
  • 一组很好的 Executors :常量池,动态池,预定或其他任何内容。只需抛出一个Runnable,剩下的就完成了。
  • 所有种类的
  • Semaphore 可以减轻您需要实施常见锁定技术的麻烦。
  • 所有对象的内置wait()notify() API。

用途

作为软件工程师,唯一剩下的就是确保您编写正确代码。这意味着您应该了解您可能会遇到的危险情况:

  • 死锁 - 两个或多个线程正在等待无序资源的情况,呈现无限等待循环。
  • Livelock - 两个或多个线程,它们礼貌地试图让位于共享资源上的另一个但最终没有接受它(考虑走廊里的两个人走来走去,不断移动从一边到另一边)
  • 饥饿 - 占用大部分或全部单个共享资源的单个线程,从而使其他线程无法访问它。

要点(或何时使用)

仅在并发性能直接改善应用程序行为时才使用线程。

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

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

如果您确实使用线程,请确保您已经彻底考虑了风险,并且三重检查您没有错过任何特殊情况。

有用(在线)资源

进入事物的最快方法是Sun concurrency tutorial。除此之外,得到一本好书。

祝你好运:)

答案 2 :(得分:3)

并发是一个深层而复杂的话题。像Java Concurrency in Practice这样的图书可能有所帮助。

有关线程的API,请参阅Concurrency Utilities Overview。例如,BlockingQueue<E>可能很有用。

  

另外支持的队列   等待队列的操作   检索时变为非空   元素,并等待空间成为   存储时可在队列中使用   元件。

请参阅CountDownLatch

  

允许一个同步辅助工具   或更多线程等待一组   在其他地方执行的操作   线程完成。

CyclicBarrier表示一些有趣的行为。

  

允许a的同步辅助   一组线程都等待每一个   另一个是达到共同的障碍点。

修改: 我正在阅读Java Concurrency in Practice。这非常好。

答案 3 :(得分:0)

  

当使用线程时,我有时将它们可视化为将空间上下文中的对象之间的三维或更多维互连编织在一起。

这听起来很复杂,你会如何构思600线程?为什么不将它们视为同时运行的多个执行线程。

  

您使用哪些API辅助线程化?

我建议最简单,最直接的是你会发现的第一场比赛。 http://www.google.co.uk/search?q=java+threads

  

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

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

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