Java mulithreadingの質問があります。私は、次のワーカークラスを持っている:私はExecutorService
を使用していたスレッドで動作するようにJava ExecutorServiceのヒープスペースの問題
public class ThreadWorker implements Runnable {
//some code in here
public void run(){
// invokes some recursion method in the ThreadWorker itself,
// which will stop eventually
{
}
:
public static int THREAD_NUMBER = 4;
public static ExecutorServide es = Executors.newFixedThreadPool(THREAD_NUMBER);
をThreadWroker
クラスのインスタンスを追加するにはここに起こる:
public void recursiveMethod(Arraylist<Integers> elements, MyClass data){
if (elements.size() == 0 && data.qualifies()){
ThreadWorker tw = new ThreadWorker(data);
es.execute(tw);
return;
}
for (int i=0; i< elements.size(); i++){
// some code to prevent my problem
MyClass data1 = new MyClass(data);
MyClass data2 = new MyClass(data);
ArrayList<Integer> newElements = (ArrayList<Integer>)elements.clone();
data1.update(elements.get(i));
data2.update(-1 * elements.get(i));
newElements.remove(i);
recursiveMethod(newElements, data1);
recursiveMethod(newElements, data2);
{
}
問題があります再帰ツリーの深さがかなり大きいので幅が広いのでThreadWorkers
がExecutorService
に追加されているので、bi G入力は、私はので、私は実行するExecutorSirvice
に追加しているので、それがメモリ不足ThreadWorkers
のginormous数を考えると、引き起こされ
Exception in thread "pool-1-thread-2" java.lang.OutOfMemoryError: Java heap space
を取得します。 ThreadWorker
は、必要なすべてに約40MbのRAMを必要とします。
ExecutorService
にいくつのスレッド(実行可能なインターフェイスを実装しているクラスのインスタンス)を追加する方法がありますか?だから私は、
while ("number of threads in the ExecutorService" > 10){
Thread.sleep(10000);
}
ように、私は私の再帰との深いや広範に移動し、それらを防ぐことはできません(「//私の問題を防ぐために、いくつかのコードは、」INT)コードの上に表示して、それを追加することができます例外をスローする状況。
よろしくお願いします。Sergey Aganezov jr。
'TreadPoolExecutor ES =て、新しいThreadPoolExecutor(4、4、10000、TimUnit.MILLISECONDS、新しいArrayBlockingQueue(10))を作成し、' し、それに 'es.setRejectedExecutionHandler(て、新しいThreadPoolExecutorをrejectedHandlerを設定します.CallerRunsPolicy()); '。 これを正しく理解すれば、実行中のスレッドの数が4に達し、キューに入れられたスレッドの数が10に達すると、次の追加されたタスクは拒否され、メインスレッドで実行され、その中の活動。 –
はい、そうです。 – ulmangt