限制JVM使用的线程数

如何设置限制某人可以创build的线程数量? 我所做的就是运行某人的代码(类似于ideone),并且想要限制他可以产生的线程数量。 怎么做? 一些jvm设置或别的东西?

编辑我添加更多的指定信息,因为有些人没有得到我的观点。

  1. 一些随机的人给我一个我的电脑将要执行的代码
  2. 代码必须在最多k个线程内执行
  3. 所有的都必须是自动化的 – 像SPOJ,ideone等一样工作

在Linux上,可以作为单独的用户运行程序,并使用shell命令ulimit -u nprocs来限制该用户的线程数(进程数)。 如果尝试超出限制, JVM将抛出一个OutOfMemoryError

但为什么你要这样做呢? 你担心程序会占用计算机的所有CPU资源吗? 如果是这样的话,你可能要考虑以较低的调度优先级运行JVM,使用nice ,所以其他进程将优先使用CPU:

  NPROCS=100 # for example NICENESS=13 # for example ulimit -u $NPROCS nice -n $NICENESS java ... 

以这种方式使用nice 应该会降低所有线程的优先级,但是对于Linux来说并不清楚 。

您可以为线程创建自己的子类,以在构造函数或启动方法中执行所需的检查。

为了确保你正在运行的代码使用你的自定义线程类,你必须用你自己的自定义类加载器来加载代码,并且该类加载器只需捕获对java.lang.Thread类的任何请求,然后实现自定义类(概念也可以扩展到其他类)。

警告:正确实施这个并不是微不足道的。

AFAIK,限制纯粹取决于OS而不是JVM。

你可以通过Executor服务来监视它们

一个Executor,提供管理终止的方法和可以产生一个Future来跟踪一个或多个异步任务进度的方法。

 ExecutorService pool = Executors.newFixedThreadPool(n);