Thread (Arrancando os cabelos..)

7 respostas
Licuri

Galera preciso de uma ajuda, é muito urgente… só falta isso…

Tipo instancio uma Classe que inicia uma Thread, e eu precido pegar o retorna que esta Thread vai buscar o problema é que o codigo continua antes da Thread acabar e o que eu quero pegar esta nulo… acredito que eu deveria esperar ela acabar para depois pegar…
MAIS COMO FAÇO ISSO… :cry: :cry: :cry:

chamada

ServiceWeb2 service = new ServiceWeb2(name,password,"validacao");
String retorno = service.getValidacao();

esta variavel retorno deverá conter o que a thread buscou…

public ServiceWeb2(String nome, String senha,String operacao) {   
      thread = new Thread(this);   
      thread.start(); 
    }

minha thread

public void run() {   
           
        /* os parametros são passados pela stream */  
        URL = "http://localhost:9080/WebService/HelloWebService";           
        this.append("connected...\n");   
        DataInputStream dis = null;
        StringBuffer strBuffer = null;
        try{   
               
            while(true){   
                   
                conection = (HttpConnection) Connector.open(URL, Connector.READ_WRITE);   
                   
                conection.setRequestMethod(HttpConnection.POST);    
                   
                conection.setRequestProperty("IF-Modified-Since","20 Jan 2001 16:19:14 GMT");   
                conection.setRequestProperty("User-Agent","Profile/MIDP-1.0 Confirguration/CLDC-1.0");   
                conection.setRequestProperty("Content-Language", "en-CA");   
                conection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");   
                   
                String dados = "username="+nome+"&password="+senha+"&operacao="+operacao;
                byte[] data = dados.getBytes();  
                  
                conection.setRequestProperty("Content-Length", Integer.toString( data.length ) );  
                  
                /* passando parâmetros */  
                OutputStream out = conection.openOutputStream();  
                out.write(data);  
                out.close();  
                  
                    if (conection.getResponseCode() == HttpConnection.HTTP_OK){  
                      
                        strBuffer = new StringBuffer();  
                        this.append("Connection OK...\n");  
                          
                        //DataOutputStream out = (DataOutputStream) conection.openDataOutputStream();  
                        dis = (DataInputStream) conection.openDataInputStream();  
         
                        /************* resposta do servidor ******************/  
                        int ch = dis.read();  

                        while(ch != -1){  
                            strBuffer.append( (char) ch );   
                        }  
                        dis.close();  
                        System.out.println(strBuffer.toString());
                        retorno = strBuffer.toString();
                        
                        conection.close(); 
                          
                    }  
                    else{  
                  
                             URL = conection.getHeaderField("location").trim();                                 
                                                                   
                             conection.close();   
                                           
                    }   
            }   
               
        }catch(IOException e){
            e.printStackTrace(); 
        }

    }

por favor preciso muito da ajuda de vcs… não aguento mais ficar com este problema… :cry: :cry:

7 Respostas

paulorb.pacheco

Opa…
acho que vc terá que utilizar dois métodos… synchronized
tipos:

Thread t1 = new Thread(this);
t1.start();

}

public void run(){
metodo1();
metodo2();
}
public synchronized void metodo1(){
//o que tem que fazer primeiro
}
public synchronized void metodo2(){
//em seguida...
}

Posso estar viajando… me corrijam por favor…

Mas já tentasse as prioridades da Thread tb???

Licuri

Cara muito obrigado, ainda não tentei as prioridades, so não entendi a sua explicação qual metodo deverá ficar sincronized ?

O meu problema é

Esse construtor instarta a Thread que por sua vez deve pegar um valor e setar em uma variavel…
tipo

run{

retorno = valorQueaThreadPegou;

}

o problema é nesse momento na hora que eu tento pegar o valor do retorno ele ainda esta nulo…

Classe classe = new Classe();—start a thread
classe.getRetorno(); – ainda esta nulo…eu so poderia pegar ele quando o processo acabasse…

:cry: :cry:

ps…vou setar a prioridade.
thread.setPriority(thread.MAX_PRIORITY);

Não adiantou…
Esse final de semana vou estudar Thead pois ninguem merece… estou desde ontem no mesmo lugar graças a este problema… :x :x

Ja tentei colocar no final do metodo run

try {

thread.join();

} catch (InterruptedException ex) {

ex.printStackTrace();

}

mais nadaele sempre volta para o metodo que o chamou no momento errado
Licuri

Ninguem? :cry: :cry: :cry: ja pesquei e ate agora não encontrei nada…e tenho que mostrar isso amanhã… eu conseguindo fazer isso o resto “vai que vai”…vamos lá pessoal… por favor

Kknd

Não é nada confiável fazer esse tipo de compartilhamento entre Threads, pois não há garantia de quando uma vai acabar e a outra vai pegar o dado e etc.

Você terá que recorrer à algum método de sincronização, seja ele colocando o “syncronized” nos métodos concorrentes (cuidado com os dead-locks!) ou utilizando alguma classe utilitária.

Licuri

Kknd:
Não é nada confiável fazer esse tipo de compartilhamento entre Threads, pois não há garantia de quando uma vai acabar e a outra vai pegar o dado e etc.

Você terá que recorrer à algum método de sincronização, seja ele colocando o “syncronized” nos métodos concorrentes (cuidado com os dead-locks!) ou utilizando alguma classe utilitária.

Cara valeu pela ajuda…

fiz desta forma
Meu midlet

public synchronized  void validateUser(String name, String password)  {
       try{
            ServiceWeb2 service = new ServiceWeb2(name,password,"validacao");
            service.startThread();
O RETORNO SEMPRE VEM NULO - PORQUE A THREAD NÃO ACABOU
            System.out.println(" retorno do service" + service.getRetorno());
        }

a thread

public synchronized void startThread(){
      thread = new Thread(this);
      thread.setPriority(thread.MAX_PRIORITY); 
      thread.start(); 
    }

o método run

public void run() {   
 
        thread.setPriority(thread.MAX_PRIORITY);
        /* os parametros são passados pela stream */  
        URL = "http://localhost:9080/WebService/HelloWebService";
        this.append("connected...\n");   
           
        try{   
               
            while(true){   
                
                conection = (HttpConnection) Connector.open(URL, Connector.READ_WRITE);   
                   
                conection.setRequestMethod(HttpConnection.POST);    
                   
                conection.setRequestProperty("IF-Modified-Since","20 Jan 2001 16:19:14 GMT");   
                conection.setRequestProperty("User-Agent","Profile/MIDP-1.0 Confirguration/CLDC-1.0");   
                conection.setRequestProperty("Content-Language", "en-CA");   
                conection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");    
                   
                String dados = "user="+nome+"&password="+senha+"&operacao="+operacao;  
                byte[] data = dados.getBytes();  
                  
                conection.setRequestProperty("Content-Length", Integer.toString( data.length ) );  
                  
                /* passando parâmetros */  
                OutputStream out = conection.openOutputStream();  
                out.write(data);  
                out.close();
                try {
                    setar();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                   break;      
            }
            try {
                thread.join();  
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }  
        }catch(IOException e){e.printStackTrace(); }   
           
           
    }   

    public synchronized  void setar() throws  Exception {
    
        if (conection.getResponseCode() == HttpConnection.HTTP_OK){  
                      
                        StringBuffer strBuffer = new StringBuffer();  
                        this.append("Connection OK...\n");  
                          
                        //DataOutputStream out = (DataOutputStream) conection.openDataOutputStream();  
                        DataInputStream dis = (DataInputStream) conection.openDataInputStream();  
                          
                          
                        /************* resposta do servidor ******************/  
                        int ch;  
 
                        while((ch = dis.read()) != -1){  
                                strBuffer.append( (char) ch );                                      
                        }  
                                dis.close();  
                          
                                
                        System.out.println("response: " + strBuffer.toString());                          
                        retorno = strBuffer.toString();
                        System.out.println("RETORNO DO PROCESSO " + retorno);
                        System.out.println(conection.getRequestMethod());  
                        System.out.println(conection.getResponseCode());  
                        System.out.println(conection.getResponseMessage());  
                                
                        conection.close();  
 
                       /*********************************************************/    
                          
                    }  
                    else{  
                  
                             URL = conection.getHeaderField("location").trim();   
                             System.out.println(URL);   
                                
                             System.out.println("entrou no ELSE");
                                                        
                             conection.close();   
                                           
                    }    
    }

Acredito que esta não é a maneira que vcs informaram… mais não conheço thread… e a unica forma dessa aplicação funcionar é utilizado ela… me ajudem…

L

Cara, depende muito da programação de cada um.
Eu Acho a maneira mais elegante de fazer isso, usar
a interface Callable , com ExecutorService e um Ojbeto Future.
A interface Callable retorna o objeto de uma computação que seja feita
em thread no seu metodo call(), ao contrario da Runnable que não tem retorno no metodo run() dela.
Quando uma thread que implementa a interface Callable é disparado por um executor de serviços no seu metodo submit(), este método retorna um objeto Future, que vc pode chamar o método get() dele pra lhe retornar o resultado.
Caso , não tenha terminado a execução deste, seu programa ira esperar essa thread terminar.

Licuri

leandrold:
Cara, depende muito da programação de cada um.
Eu Acho a maneira mais elegante de fazer isso, usar
a interface Callable , com ExecutorService e um Ojbeto Future.
A interface Callable retorna o objeto de uma computação que seja feita
em thread no seu metodo call(), ao contrario da Runnable que não tem retorno no metodo run() dela.
Quando uma thread que implementa a interface Callable é disparado por um executor de serviços no seu metodo submit(), este método retorna um objeto Future, que vc pode chamar o método get() dele pra lhe retornar o resultado.
Caso , não tenha terminado a execução deste, seu programa ira esperar essa thread terminar.

Cara muito obrigado mesmo, mais antes de vc postar eu resolvi, fazendo um for.
olha só mais vou olhar a forma que vc implementou valeu…

no método run

while(rodar){   
                try {
                    thread.sleep(100);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
--- restante do código

Depois que a Thread Inicia eu chamo esse cara…

public String parar(){
      
      for(int i=0; i < 1000; i++){
           System.out.println(retorno);
        }
      rodar = false;
        return retorno;
  }

lembrando que eu estou usando jme…
valeu.

Criado 17 de maio de 2007
Ultima resposta 18 de mai. de 2007
Respostas 7
Participantes 4