Java:线程技术和概念

And*_*NER 6 java multithreading visualization

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

是否有任何API使用哪种辅助线程?

您是否以一种不构思为线程为过程的方式使用线程?

Chr*_*est 14

是否有任何API使用哪种辅助线程?

你是说appart来自java.util.concurrentFunctionalJava得到了一些有助于并发编程的结构,如从这里开始的多部分教程中所述.

您是否以一种不构思为线程为过程的方式使用线程?

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

在封面下,它只是线程,但是当我们停止关注单个线程并且只是将它们想象为一些插槽,你可以以某种方式将代码放入并让它运行一段时间,那就是当我们开始达到更高的抽象水平.

代理/演员是一种常见的方法.一个Actor就像一个有一块状态的线程,然后你可以发送一些代码然后说"当你有时间时,你可以对你的状态做这件事"或者其他什么.


Yuv*_*dam 8

首先

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

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

Java并发API

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

  • RunnableThread您可以扩展的接口和对象.只需输入您的代码,您就可以运行一个线程了
  • 一组很好的Executors:常量池,动态池,预定或其他.只需扔掉Runnable它就能完成其余的工作.
  • Semaphores和各种锁可以减轻你需要实现常见锁定技术的麻烦.
  • 所有对象的内置wait()notify()API.

用途

作为软件工程师,唯一剩下的就是确保编写正确的代码.意思是你应该知道你可能会暴露自己的危险情况:

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

要点(或,何时使用)

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

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

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

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

有用的(在线)资源

进入事物的最快方法是进行Sun并发教程.除此之外,得到一本好书.

祝好运 :)