如何限制某人可以创建的线程数?我所做的是运行某人的代码(类似于 ideone),并希望限制他可以生成的线程数。怎么做?一些jvm设置或其他东西?
编辑我添加了更多指定的信息,因为有些人不明白我的意思。
- 某个随机的人向我发送了我的计算机将要执行的代码
- 代码必须在使用最多 k 个线程内执行
- 一切都必须自动化——像 SPOJ、ideone 等一样工作。
如何限制某人可以创建的线程数?我所做的是运行某人的代码(类似于 ideone),并希望限制他可以生成的线程数。怎么做?一些jvm设置或其他东西?
编辑我添加了更多指定的信息,因为有些人不明白我的意思。
在 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。
您可以为在构造函数或 start 方法中执行所需检查的线程创建自己的子类。
为确保您正在运行的代码使用您的自定义线程类,您必须使用您自己的自定义类加载器加载代码,并且该类加载器仅捕获对 java.lang.Thread 类的任何请求并分发您的自定义类(概念也可以扩展到其他类)。
警告:正确实施这一点并非易事。
AFAIK,Limit 完全取决于操作系统而不是 JVM。
你可以通过 Executor 服务来监控它们
一个 Executor,它提供了管理终止的方法和可以生成 Future 以跟踪一个或多个异步任务的进度的方法。
ExecutorService pool = Executors.newFixedThreadPool(n);