限制JVM使用的线程数

时间:2013-06-27 11:26:52

标签: java linux multithreading jvm

如何设置某人可以创建的线程数限制?我所做的是运行某人的代码(类似于ideone),并希望限制他可以生成的线程数。怎么办?一些jvm设置或其他什么?

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

  1. 一些随机的人发给我一个我的电脑要执行的代码
  2. 代码必须在最多使用k个线程的情况下执行
  3. 所有必须自动化 - 像SPOJ,ideone等一样工作

3 个答案:

答案 0 :(得分:6)

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

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

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

以这种方式使用nice 应该降低所有线程的优先级,但it is not clear that it does so for Linux

答案 1 :(得分:2)

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

为确保您运行的代码使用您的自定义线程类,您必须使用自己的自定义类加载器加载代码,并且该类加载器只捕获对java.lang.Thread类的任何请求而是将你的自定义类分发出去(这个概念也可以扩展到其他类)。

警告:正确实施并非易事。

答案 2 :(得分:0)

AFAIK,Limit完全取决于操作系统不在JVM上。

您可以通过Executor service

监控它们

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

ExecutorService pool = Executors.newFixedThreadPool(n);