Java 在JVM中创建多线程以实现高用户负载

Java 在JVM中创建多线程以实现高用户负载,java,c,java-native-interface,Java,C,Java Native Interface,我有一个C程序,它将在Java存储中存储和检索大量数据。我在我的C程序中施加了很大的压力,多个线程正在从Java存储区添加和检索数据。java将如何处理这种负载?因为如果只有一个主线程运行JVM并处理来自C的所有请求,那么它可能会成为我的瓶颈。Java会创建多个线程来处理负载,还是程序员的工作就是创建线程,然后中止线程 我的java存储只是一个哈希表,它根据提供的键存储来自C的数据 纯Java要求您编写自己的线程 如果您通过web服务与java通信,那么web容器很可能会为您管理线程 我猜您正在

我有一个C程序,它将在Java存储中存储和检索大量数据。我在我的C程序中施加了很大的压力,多个线程正在从Java存储区添加和检索数据。java将如何处理这种负载?因为如果只有一个主线程运行JVM并处理来自C的所有请求,那么它可能会成为我的瓶颈。Java会创建多个线程来处理负载,还是程序员的工作就是创建线程,然后中止线程


我的java存储只是一个哈希表,它根据提供的键存储来自C的数据

纯Java要求您编写自己的线程

如果您通过web服务与java通信,那么web容器很可能会为您管理线程

我猜您正在使用JNI,因此情况可能更复杂。根据JNI调用的具体方式,您可以在JVM中的多个线程上进行调用


我得问问。。。JNI非常粗糙且容易出错,很容易破坏整个过程并产生各种各样的神秘错误。没有包含哈希表的C库可以使用吗?甚至编写一个,它的工作量肯定比编写JNI要少。

普通Java要求您编写自己的线程

如果您通过web服务与java通信,那么web容器很可能会为您管理线程

我猜您正在使用JNI,因此情况可能更复杂。根据JNI调用的具体方式,您可以在JVM中的多个线程上进行调用


我得问问。。。JNI非常粗糙且容易出错,很容易破坏整个过程并产生各种各样的神秘错误。没有包含哈希表的C库可以使用吗?甚至写一个,它的工作量肯定比做JNI少。

我认为这取决于java代码的实现。如果它被证明不是线程,那么这里有一个可能比混乱的JNI更干净的替代方案:

创建一个Java守护进程,该进程与存储进行通信,存储在请求的内部线程化,以确保高效的负载处理。使用java.util.concurrent.Executors创建的单个ExecutorService为存储/检索操作的工作队列提供服务。每个存储/检索方法调用都向工作队列提交一个可调用的方法,并等待它运行。ExecutorService将自动对存储/检索操作进行排队和多线程处理。除了与C程序的通信之外,整个过程应该少于100行代码

您可以使用进程间通信技术(可能是套接字)从C与这个Java守护进程通信,这将避免JNI,并让一个Java守护进程线程为C程序的多个实例提供服务


或者,您可以使用JNI调用守护进程上的基本存储/检索操作。与当前相同,只是java守护进程可以修饰方法,以提供缓存、同步和与线程相关的各种新奇事物。

我认为这取决于java代码的实现。如果它被证明不是线程,那么这里有一个可能比混乱的JNI更干净的替代方案:

创建一个Java守护进程,该进程与存储进行通信,存储在请求的内部线程化,以确保高效的负载处理。使用java.util.concurrent.Executors创建的单个ExecutorService为存储/检索操作的工作队列提供服务。每个存储/检索方法调用都向工作队列提交一个可调用的方法,并等待它运行。ExecutorService将自动对存储/检索操作进行排队和多线程处理。除了与C程序的通信之外,整个过程应该少于100行代码

您可以使用进程间通信技术(可能是套接字)从C与这个Java守护进程通信,这将避免JNI,并让一个Java守护进程线程为C程序的多个实例提供服务


或者,您可以使用JNI调用守护进程上的基本存储/检索操作。与当前相同,只是java守护进程可以修饰方法,以提供缓存、同步和与线程相关的各种奇特功能。

您肯定要检查,其中包含有关将多个本机线程附加到JVM的信息。此外,您还应该考虑需要使用的映射实现。如果从多个Hashtable进行访问可以工作,但可能会带来瓶颈,因为它在每次调用时都是同步的,这实际上意味着一次只能读取或写入一个线程。考虑CONCURNESHASMAP,它使用锁条带和提供器更好的并发吞吐量。 如果你关心瓶颈和潜伏期,有两件事要考虑。

  • 在负载沉重的系统上,锁定可能会带来很高的开销。如果你的map的大小和写的频率允许,考虑使用一个不可变的映射,并执行一个拷贝写方法,其中一个线程将通过更新地图的副本来处理写入,并用新版本替换原件(确保引用是一个易失性变量)。这将允许在不阻塞的情况下进行读取
  • 通过JNI从C调用Java可能也会成为一个瓶颈,其速度不如在另一个方向(Java到C)调用快。您可以将直接ByteBuffers传递给包含对C数据结构的引用的Java,并允许Java通过直接ByteBuffer向下调用C

您肯定要检查,其中包含有关将多个本机线程附加到JVM的信息。此外,您还应该考虑需要使用的映射实现。如果从多个哈希表进行访问可以工作,但可能会带来瓶颈,因为它在每次调用时都是同步的,这实际上意味着单线程读取