代码之家  ›  专栏  ›  技术社区  ›  ata

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

  •  1
  • ata  · 技术社区  · 16 年前

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Michael Barker    16 年前

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

    如果你担心瓶颈和延迟,需要考虑两件事。

        2
  •  0
  •   djna    16 年前

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

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

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

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

        3
  •  0
  •   BobMcGee    16 年前

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

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

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