什么是多线程的最佳替代方案?

Ani*_*mar 7 java concurrency multithreading actor

目前我们在应用程序(Java)中使用线程.但是一次创建了大约1000个(或更多)线程.这个线程应该处理数据并将其存储在db中.

这会占用更多内存和I/O.

什么可能是最好的选择呢?可扩展性,一致性和性能是主要要求.

Cep*_*pod 17

你试过线程池吗?线程池由合理数量的线程组成(足以使用所有处理器,但不多),并重新使用线程(再次减少开销)以同时执行大量任务.

这是一个给你一个想法的小例子

ExecutorService executor = Executors.newFixedThreadPool(5);
Runnable job = new Runnable() {
     public void run() {
        // do some work
     }
}
executor.execute(job);
Run Code Online (Sandbox Code Playgroud)

如果你看一下ScheduledThreadPoolExecutor,你会发现许多用于执行和调度作业的功能.


eli*_*sah 13

试着看一下Actor模型.

角色模型是一个并行编程模型,其中,工作负荷并行,称为运行实体之间的分配行为.

它是一种模型,其中没有共享状态,参与者是孤立的,信息可以以消息的形式流动.

玩家接收这些消息并且只能反应操纵消息中的数据(计算或处理数据),向其他玩家发送消息或创建新的演员.

这个模型是对互斥锁和线程的高级抽象,它消除了开发人员的复杂性,它主要用于构建高可用性和竞争性的电信系统,由Ericsson于1973年在Erlang上构建.

Actor是非常轻量级的并发实体.它们使用事件驱动的接收循环异步处理消息.对消息进行模式匹配是表达演员行为的便捷方式.它们提高了抽象级别,使编写,测试,理解和维护并发和/或分布式系统变得更加容易.您可以专注于工作流 - 消息在系统中的流动方式 - 而不是线程,锁和套接字IO等低级原语.

Java/Scala中,您可以找到基于此actor模型构建的Akka框架.

  • Spark每个jvm没有运行很多线程."很多"我的意思是数百或更多这个级别的性能差异确实显示出来. (2认同)

Dak*_*ron 9

使用线程池.这样,您就可以定义要运行的多个线程.每个新任务都被放入队列并在那里等待,直到线程完成其旧任务,从而可以自由地处理新任务.

这是可扩展的,因为您可以定义要运行的线程数.您可以在具有少量处理内核的设备上选择少数线程来节省内存并减少同步开销,或者在具有多个内核的设备上选择多个线程.因此,例如,如果您在具有4个内核和超线程的设备上运行此选项,请选择8个线程,如果您在具有48个硬件线程的设备上运行它,则选择48个线程.

性能通常比为每个任务启动新线程更好,因为启动和杀死线程确实有一些开销.线程池重用线程,因此没有那个开销.

它也是一致的,因为Java标准库中有一个线程池实现.


cir*_*ter 5

我认为您不需要替代多线程,只需要更高效的线程实现.

Quasar 为JVM 添加了 纤维(即轻量级线程),你可以创建甚至数百甚至数百个,因此你可以获得相同的异步框架性能,而不会放弃线程抽象和常规命令控制流构造(序列,循环)等)以该语言提供.

它还将JVM/JDK的线程及其光纤统一在一个公共链接接口下,因此它们可以无缝地互操作,并提供java.util.concurrent对这个统一概念的移植.这也意味着您的移植工作量将是最小的(如果有的话).

在股线(纤维或常规线程)之上,Quasar还提供成熟的Erlang风格的演员(请参阅此处与Akka进行比较),阻止Go-like频道数据流编程,因此您可以选择适合的并发编程范例最好的技能和需求,而不是被迫一个人.

它还为流行和标准技术提供绑定(作为Comsat项目的一部分),因此您可以保留代码资产,因为移植工作量很小(如果有的话).出于同样的原因,如果您选择,也可以轻松选择退出.

目前类星体已经绑定Java的78,Clojure的脉冲星项目,JetBrains公司科特林.基于JVM字节码检测,如果存在集成模块,Quasar可以真正使用任何JVM语言,并且它提供了构建其他模块的工具.

从Java9开始,检测将是自动的,不再需要集成模块.

  • 看起来这是您的雇主开发的技术.你应该宣布你的从属关系:http://meta.stackexchange.com/questions/57497/limits-for-self-promotion-in-answers#59302 (2认同)