2013-06-27 34 views
7

如何設置限制某人可以創建的線程數?我所做的就是運行某人的代碼(類似ideone),並想限制他可以產生的線程數。如何做?一些jvm設置或其他什麼?限制JVM使用的線程數

編輯 我添加更多的指定信息,因爲有些人沒有得到我的觀點。

  1. 一些隨機的傢伙給我這我的​​電腦是要執行
  2. 代碼必須在使用最大k個線程的執行代碼
  3. 都必須是自動化的 - 那樣工作SPOJ,ideone等
+0

java byte-code injecter maybe?就像一個java分析器,但增加了一些東西而不是檢查。您可以在啓動之前限制jvm內存空間,但它的精確值可能爲1000或10000,線程大小也很重要。此外限制存儲空間可能會產生相反的效果 –

+0

使用線程池,限制 –

+0

@BobFlannigon這不是我的代碼。我的機器只會運行它,我想要的是禁止啓動新線程。例如,如果有人產生線程,它甚至會崩潰,但無論如何它不能執行。如何做? – abc

回答

0

AFAIK,限制完全取決於OS而不是JVM。

,您可以通過一個Executor service

執行人提供方法來管理終端和方法,可以產生未來爲跟蹤一個或多個異步任務執行進度監控。

ExecutorService pool = Executors.newFixedThreadPool(n); 
+0

ExecutorService如何幫助我,如果它不是我的代碼,並且有些可以使用extends Thread?有限的只是來自這個池的線程,但它不會阻止某人創建其他池或只是簡單地擴展線程。 – abc

2

您可以創建自己的線程子類,在構造函數或啓動方法中執行所需的檢查。

爲了確保您正在運行代碼使用您的自定義線程類,你必須用自己的自定義類加載器加載代碼和類加載器只是抓住了java.lang.Thread類和任何要求的手了您的自定義類(該概念也可以擴展到其他類)。

警告:實施這適當是不平凡的。

+0

這是個不錯的想法,我提出的問題如此投票太多,但不會使用它更具體的語言,這實際上是我的錯 - 我的問題是具體的java :) – abc

6

在Linux上,您可以作爲單獨的用戶運行該程序,並使用shell命令ulimit -u nprocs來限制該用戶的線程數(進程數)。如果企圖超過限制,the JVM will throw an OutOfMemoryError

但你爲什麼要這樣做呢?你擔心程序會佔用計算機的所有CPU資源嗎?如果是的話,你可能要考慮運行的JVM以較低的調度優先級,使用nice,所以其他進程將得到優先使用的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

+0

事實上,我會嘗試寫SPOJ像系統它在有人嘗試使用pthread創建線程或惡魔(可以追蹤fork等)時,很容易在C/C++中找到它。我以爲java線程與物理線程沒有任何關係。這就是爲什麼詢問一些jvm設置的原因。上投票。關於cpu資源我將使用cpulimit。您可以設置時間哪個進程可以使用% – abc