7

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

编辑我添加了更多指定的信息,因为有些人不明白我的意思。

  1. 某个随机的人向我发送了我的计算机将要执行的代码
  2. 代码必须在使用最多 k 个线程内执行
  3. 一切都必须自动化——像 SPOJ、ideone 等一样工作。
4

3 回答 3

6

在 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

于 2013-06-27T12:16:45.113 回答
2

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

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

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

于 2013-06-27T12:13:27.060 回答
0

AFAIK,Limit 完全取决于操作系统而不是 JVM。

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

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

ExecutorService pool = Executors.newFixedThreadPool(n);
于 2013-06-27T11:34:51.513 回答