什么是multithreading的最佳替代方案?

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

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

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

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

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

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

如果查看ScheduledThreadPoolExecutor ,您会发现很多用于执行和调度作业的function。

试着看一下Actor模型 。

actor模型是并发编程模型,其中工作负载在并行运行的实体(称为actor)之间分配。

它是一种模型,其中没有共享状态 ,参与者被隔离,信息可以以消息的forms流动。

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

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

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

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

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

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

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

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

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

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

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

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

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

目前,Quasar拥有Java 78的 绑定 , Pulsar项目下的Clojure和JetBrains的Kotlin 。 基于JVM字节码检测,如果存在集成模块,Quasar可以真正使用任何JVM语言,并且它提供了构建其他模块的工具。

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