Thread para executar uma URLConnection

Pessoal,

Preciso fazer chamadas a minha aplicação web e para isto estou utilizando a classe URLConnection. O meu problema é que preciso que isso seja feito sem barrar a continuação do meu loop… pensei em fazer com Thread porque na minha cabeça isso isolaria o processamento em outro lugar e me deixaria livre para continuar sem ter de esperar o retorno da classe que acessa minha aplicação web… Mas não funciona. ele fica “aguardando” o retorno para então prosseguir. estou fazendo assim:

package classWithoutMain;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.util.Random;

public class ContactPOO extends Thread {
	public int a = 0;
	public String url = "http://l2pog.com/php/register.php?155426";
	public Random num = new Random();
	public String proxy = "200.101.82.216";
	public int port = 3128;
	public String parametros = "cpf=" + num.nextInt(07451545602) + "&email="
			+ num.nextInt() + "%l2pog%2Ecom&password=aaaaaa&username="
			+ num.nextInt()
			+ "ulaos&pais=Brasil&nome=asdasdasdasdasdas&sexo=Masculino";

	public String send() {
		try {
			Proxy pro = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxy,
					port));

			URL urlConnection = new URL(url);
			HttpURLConnection postConnection = (HttpURLConnection) urlConnection
					.openConnection();
			postConnection.setDoInput(true);
			postConnection.setDoOutput(true);
			postConnection.setRequestProperty("Request-Method", "POST");
			postConnection.setRequestProperty("Content-type",
					"application/x-www-form-urlencoded ");
			postConnection
					.setRequestProperty(
							"User-Agent",
							"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
			postConnection.setRequestProperty("Host", "www.ivannet.com.br");
			OutputStreamWriter writer = new OutputStreamWriter(
					postConnection.getOutputStream(), "iso-8859-1");
			writer.write(parametros);
			writer.flush();
			writer.close();

			BufferedReader retorno = new BufferedReader(new InputStreamReader(
					postConnection.getInputStream()));

			String ret = retorno.readLine() + "\n ";
			System.out.println(ret);
			retorno.close();
			postConnection.getInputStream();
			postConnection.disconnect();
			this.finalize();
			return ret;
		} catch (MalformedURLException e) {
			return "Erro na url: " + e.getMessage();
		} catch (IOException e) {
			return "Erro AIo: " + e.getMessage();
		} catch (Throwable e) {
			return "Erro Terminar a Thread: " + e.getMessage();
		}

	}
	
	@Override
	public synchronized void start() {
		super.start();
		send();
	}
}

a classe acima seria a thread responsável pelo consumo da minha aplicação.

package classWithoutMain;

public class StarterContact {
	public static void main(String args[]) {

		for (int a = 0; a < 10; a++) {
			Thread cont = new ContactPOO();
			cont.start();
			System.out.println(a);
		}
	}
}

aí eu testo se está acontecendo o que preciso. que seria a impressão do contador a e só depois os resultados da ContactPOO que tem o retorno da minha aplicação web…

creio que deveria retornar assim:
0
1
2
3

result=cadastroOK
result=cadastroOK
result=cadastroOK

mas o que acontece é:

result=cadastroOK

0
result=cadastroOK

1
result=cadastroOK

2
result=success

3
result=cadastroOK

como resolver esse problema?

Seu código:

for (int a = 0; a < 10; a++) { Thread cont = new ContactPOO(); cont.start(); System.out.println(a); }

Está fora da Thread, ele a dispara, você não pode querer que o que
dispara a Thread seja algo concorrente.

Se está fora, é óbvio que vai continuar seguindo o fluxo e parar no
ponto onde dispara a Thread.

Acho que o que vc quer é que o Send, dentro da Thread aconteça
várias vezes, então coloque ele dentro de um while, ou mesmo de
um for, mas só instancie e dispare a Thread uma única vez.

[quote=JoaoBluSCBR]Seu código:

for (int a = 0; a < 10; a++) { Thread cont = new ContactPOO(); cont.start(); System.out.println(a); }

Está fora da Thread, ele a dispara, você não pode querer que o que
dispara a Thread seja algo concorrente.

Se está fora, é óbvio que vai continuar seguindo o fluxo e parar no
ponto onde dispara a Thread.

Acho que o que vc quer é que o Send, dentro da Thread aconteça
várias vezes, então coloque ele dentro de um while, ou mesmo de
um for, mas só instancie e dispare a Thread uma única vez. [/quote]

me desculpe JoaoBluSCBR, mas isso não adianta já havia feito e da na mesma, porque terei um único processamento acessando minha aplicação web várias vezes e o problema da espera continuará acontecendo.

Bem, eu só tentei dar uma sugestão.

Threads são boas para acessar processos concorrentes, mas quando se trata de meios físicos (redes, arquivos), o processo delas também ficará na dependência.

Se dentro da tua thread há um comando que depende de um retorno de rede, ou leitura física de arquivo, este comando também parará e te fará esperar.

Não li seu código todo, me desculpe, mas achei estranho um processo tão grande como o send todo dentro de uma thread. Me parece que você teria de colocar threads para fazer apenas partes e nas restantes colocar ifs que as pulassem caso determinado condição não fosse cumprida como.

Do jeito que está, sempre vai haver a parada pois não há como seguir processando determinado evento sem que haja a resposta da rede ou da leitura do arquivo.

Dificil, sinto não poder ajudar mais.

O código send() deve ser chamado dentro do método run e não do start.