在JVM中操作线程实现

时间:2011-07-20 21:15:21

标签: java concurrency multicore concurrent-programming java.util.concurrent

最近,我一直致力于将并发对象部署到多核上。在示例中,我使用BlockingQueue.take()方法,其规范提到它是阻止。这意味着该方法不会释放封闭线程的资源,以便可以将其重用于其他并发任务。这很有用,因为JVM实例中的活动线程总数是有限的,如果应用程序需要数千个活动线程,那么能够重新使用挂起的线程至关重要。另一方面,JVM使用从应用程序级线程到Java级操作系统级线程的1:1映射;即每个Java Thread实例都成为底层OS级别的线程。

当前的解决方案基于Java 1.5+中的java.util.concurrency。尽管如此,我们仍然需要可扩展到大量工作线程的工作线程。现在,我有兴趣找到以下答案:

  • 有没有办法在JVM中替换java.lang.Thread的实现,以便我可以插入自己的Thread实现?
  • 这只能通过在JVM中调整线程实现的C ++部分并重新编译它来实现吗?
  • 是否有任何库提供替换Java中的经典线程的方法?
  • 同样,在同一行中,是否有一个库或方法来指导如何将中的某些线程映射到操作系统级别中的只有一个线程?

我还发现this讨论了JVM的不同实现,我不确定它们是否能提供帮助。

提前感谢您的意见和想法。

1 个答案:

答案 0 :(得分:1)

如果要创建数千个线程,那么你做错了。

相反,请考虑使用Executor框架。 (从ExecutorsThreadPoolExecutor类开始。)它们允许您排队数千个任务,同时拥有一个合理数量的线程来处理它们。

我猜这种方法就是你用“库替换经典线程”的意思。我强烈建议你研究执行者。

一个警告:默认情况下,执行程序使用非守护程序线程。因此,您必须在完成后关闭执行程序。你可以在程序退出时执行此操作,如果有一种退出程序的正常方法,而不仅仅是等待所有线程完成。 : - )