Threads demais

10 respostas
Guilherme_Gomes

Estou com uma aplicação web que em uma área especifica do site o usuario manda processar um arquivo.

Para que o arquivo seja processado, mando uma thread ser iniciada usando o código a seguir:

public class CallProcess {
	public static void call(String file){
		ParallelProcessing pp = new ParallelProcessing(file); // Thread
		pp.start();
	}
}

Mas quando vejo o log da minha aplicação ele inicia 2 vezes a thread a primeira vez, chamando uma vez apenas a função call() acima, sendo que só uma thread deveria ser startada…

Mandando processar de novo, são iniciadas varias threads (umas 4 ou 5) e o método call é chamado 2 ou mais vezes… E cada vez que mando processar o arquivo o número de threads chamadas aumenta, sendo que só uma thread por vez pode ser instanciada!!!

Alguem pode ajudar?

Obrigado,

10 Respostas

Leandro_Carvalho

Acho que o problema não está nessa CallProcess, você poderia colocar o código ou parte dele, da Thread e de quem chama essa CallProcess?

Guilherme_Gomes

A call process é só isso mesmo…

Quem chama é um JSP cujo o conteúdo é apenas o seguinte

<script>
<%
	br.com.bla.process.CallProcess.call(request.getParameter("id"));

	if ( request.getAttribute("msg") != null ){
	%> alert("<%=request.getAttribute("msg")%>"); <%	
	}

	out.print("window.location.href='/proc/index.jsp?folder=" + request.getParameter("folder") + "';");
%>
</script>

E a thread é bem longa… o metodo run verifica se o arquivo existe, cria um log pra ele, verifica mais uma série de coisas e bla bla bla… Não acho necessario colocar o metodo run aqui.

O que realmente importa no metodo run() é uma outra classe que ele usa para processar os dados do arquivo (essa classe não é uma thread e o metodo não é sincronizado)… Não acho necessário colocar essa classe também, o problema está no começo, realmente não consigo entender o que acontece com a aplicação para instanciar varias threads em um start só…

Abaixo está o log de um caso extremo, onde varias vezes foi chamado o call e as threads (não deveria aparecer mensagens repetidas):


—Calling: Iniciando Thread
—Calling: Iniciando Thread
—Calling: Iniciando Thread
—Calling: Iniciando Thread
—Calling: Iniciando Thread
—Calling: Iniciando Thread
—Calling: Iniciando Thread
—Calling: Thread executando
—Calling: Thread executando
—Calling: Thread executando
—Calling: Thread executando
—Calling: Thread executando
—Calling: Thread executando
—Calling: Thread executando
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: Iniciando…
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: arquivo: exec.txt
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: tamanho: 749 bytes
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
—Thread: Chamando processamento do arquivo para criação do arquivo de update e insert…
— Processamento: Iniciando…
— Processamento: Iniciando…
— Processamento: Iniciando…
— Processamento: Iniciando…
— Processamento: Iniciando…
— Processamento: Iniciando…
— Processamento: Iniciando…
— Processamento: Iniciando…
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffRead: java.io.BufferedReader@128dff1
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
BuffPrintStream: java.io.PrintStream@86510a
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: 1 updates gerados
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
— Processamento: Nenhum insert foi gerado.
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: Finalizou processo de criação do arquivo de insert e update…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
—Thread: chamando atualização de BD…
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, iniciando
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
— Atualizando BD, saída: Executado sem problemas
—Thread: finalizando…
—Thread: finalizando…
—Thread: finalizando…
—Thread: finalizando…
—Thread: finalizando…
—Thread: finalizando…
—Thread: finalizando…
—Thread: finalizando…
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: arquivo (transferido): exec.txt
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: tamanho (transferido): 749 bytes
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.
—Thread: Processamento finalizado.

vanzella

Complicado hein, você deve deixar mais claro sua duvida, para que as pessoas possam ajudar.

quem é?

public class CallProcess
Onde esta seu Thread? esta implementando runnable ta sobrescrevendo Thread? cade o construtor de ParallelProcessing ?

Lembre-se que não sabemos nada do seu codigo, dificil ajudar assim…

Guilherme_Gomes

Thread:

public class ParallelProcessing extends Thread {
	private static String color [] = {"8278ff","ff8b78","ffc178","f74141","ffffff","f5f741","67f741",
									  "db7be4","b6b6b6","be9668","50813c"};
	private static int whichColor = 0;
	private String nome;
	
	public ParallelProcessing(String nome){
		this.nome = nome;
	}
	
	@Override
	public void run() {
              ....//grande demais
        }
}
Guilherme_Gomes

Só retomando o tópico de ontem que eu não estou conseguindo resolver… Fiz algumas tentativas da seguinte maneira:

public class CallProcess {  
    public static void call(String file){  
        Log.log("Antes");
        ParallelProcessing pp = new ParallelProcessing(file); // Thread  
        Log.log("Durante");
        pp.start();  
        Log.log("Depois");
    }  
}

E quando olho no meu arquivo de Log ele mostra a seguinte entrada para apenas uma chamada de call() :


Antes
Durante
Durante
Depois
Depois

Agora por que está aparecendo 2 vezes “Durante” e “Depois” e apenas uma “Antes”… Essa é a questão que estou tentando descobrir…

Obrigado

T

O que esse construtor faz? (Dica: nunca é bom fazer uma classe estender Thread. Você pode acabar fazendo alguma salada. O correto é ela implementar Runnable, e criar uma thread a partir dela: )

class ParallelProcessing implements Runnable {
    public void run() {
        ....
    }
}
...
ParallelProcessing pp = new ParallelProcessing(file);
Thread thr = new Thread (pp);
thr.start();
Guilherme_Gomes

Vou tentar e qualquer coisa posto aqui… Obrigado!

Guilherme_Gomes

Fiz o código da maneira que o thingol sugeriu:

public class CallProcess {
	public static void call(String file){
		ProcessLog.init(EntryPoint.getContext());
		ProcessLog.logMaster(true);
		ParallelProcessing pp = new ParallelProcessing(file);
		new Thread(pp).start();
		ProcessLog.logMaster(false);
	}
}

e a thread:

class ParallelProcessing implements Runnable { 
        ....
        public ParallelProcessing(String nome){
		this.nome = nome;
		ProcessLog.log("---Thread: Thread contruída", color[whichColor]);		
	} 
        public void run() {  
            ....  
        }  
}

Mas mesmo assim, o problema acontece, iniciando duas threads.
**O ProcessLog.logMaster(true); loga a frase “—Calling: Iniciando Thread”
**O ProcessLog.logMaster(false); loga a frase “—Calling: Thread executando”


—Calling: Iniciando Thread
—Thread: Thread contruída
—Thread: Thread contruída
—Calling: Thread executando
—Calling: Thread executando
—Thread: Iniciando…
—Thread: Iniciando…

Não sei se realmente são iniciadas duas threads (o que parece), mas o Log mostra a primeira chamada do log apenas uma vez e, depois que a thread é instanciada, chama cada Log duas vezes…

rodrigo_corinthians

Colocando synchronized no método call não resolveria?

Guilherme_Gomes

Ja tentei usar synchronized ! Não funcionou. Mas também não faz sentido funcionar, ja que o método call() só está sendo chamado uma vez mesmo! O estranho é que só o final desse método que está passando duas vezes, o começo passa normalmente !!

Criado 11 de setembro de 2007
Ultima resposta 12 de set. de 2007
Respostas 10
Participantes 5