Threads ou Pool Threads

3 respostas
B

Ola, estou com um problema com as threads, necessito que crie um determinado numeros de threads apartir do que o usuario passar pelo prompt de comando, porem as vezes acontece uns erros que ja pesquisei em todos os cantos e nao consigo resolver! segue meu codigo

public class Work implements Runnable {
	
	static int aClass = 0;
	static int bClass = 0;
	static int cClass = 0;
	static int dClass = 0;
	static int ipStop = 0;
	
	public Work(int ipStart, int ipStopp) {
		aClass = ipStart;
		ipStop = ipStopp;
	}
	
	public void run() {
		String host = aClass+"."+bClass+"."+cClass+"."+dClass;
		if (aClass <= ipStop) { 
			dClass++;
			if (dClass == 256) {
				cClass++;
				dClass = 0;
			}
			if (cClass == 255) {
				bClass++;
				cClass = 0;
			}
			if (bClass == 255) {
				aClass++;
			}
		}
		System.out.println(host);
		Thread.yield();
	    try {
	    	Thread.sleep((int)(Math.random() * 1000));
	    } catch (InterruptedException e) {
	    	System.out.println("Erro Thread");
	    }
	}
}

Segue minha classe teste:

import java.util.concurrent.*;


public class Teste {
	
	public static void main(String args[]) {
		int numThread = Integer.parseInt(args[0]);
                ExecutorService tpes = Executors.newFixedThreadPool(numThread);
                int a = 255 * 255 * 255;
                for (int i = 0; i < a; i++) {
                       tpes.execute(new Work(60,61)); // 60 e 61 seria entre 60.0.0.0 ate 61.0.0.0
                }
                tpes.shutdown();

	} 
	
}


Acontece que as vezes surgem esse erro, alias varias vezes! Normalmente quando coloco por exemplo 100 threads, ou entao 10, 50 nao consigo entender o erro. No erro abaixo utilizei o numero de threads de 50

60.0.0.152
Exception in thread "pool-1-thread-50" java.lang.OutOfMemoryError: Java heap space at Work.run(Work.java:19)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
60.0.0.153
60.0.0.154
60.0.0.155
60.0.0.156
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
60.0.0.157

3 Respostas

B

bom… dentro do que estou procurando, tive a ideia de poder reutilizar as threads. Teria como ? Porque quando chamo o comando Thread.CurrentThread() ele nao esta utilizando uma thread ja criada, esta criando uma para cada Objeto Work. Teria como eu reutilizar threads ?

Dieval_Guizelini

bertu,

uma thread concluída não pode ser reiniciada… e na forma que você tem o código não te ajuda.

O problema apontado na linha 2 foi um “OutOfMemoryError”, duas coisas para resolver:

  1. aumentar o heap da vm - -Xms e -Xmx
  2. rever o código, evitar criação de objetos desnecessários e eventualmente forçar o gc (System.gc())

Por exemplo:

// Não faça isso: String host = aClass+"."+bClass+"."+cClass+"."+dClass; // utilize: String.format("%d.%d.%d.%d",aClass,bClass,cClass,dClass);

Acho que o pool está sendo utilizado de forma errada também, se não me engano você deveria substituir:

for (int i = 0; i < a; i++) { tpes.execute(new Work(60,61)); } // por int i=0; while (!executor.isShutdown() && i<a ) { executor.submit(new Work(60,61) ); i++; }

fw

B

Ok, fiz alteraçoes mais mesmo assim nao ficou 100% … nao tem mais alguma ideia ?

Criado 5 de abril de 2009
Ultima resposta 5 de abr. de 2009
Respostas 3
Participantes 2