Foros del Web » Programación para mayores de 30 ;) » Java »

sincronizar metodos

Estas en el tema de sincronizar metodos en el foro de Java en Foros del Web. Hola, Necesito ayuda para sincronizar unos metodos. Segun he estado leyendo lo que hace synchronized si lo pongo en un metodo es que solo me ...
  #1 (permalink)  
Antiguo 21/02/2012, 05:06
Avatar de godisa  
Fecha de Ingreso: noviembre-2011
Mensajes: 46
Antigüedad: 12 años, 5 meses
Puntos: 1
Pregunta sincronizar metodos

Hola,
Necesito ayuda para sincronizar unos metodos. Segun he estado leyendo lo que hace synchronized si lo pongo en un metodo es que solo me va a dejar que se ejecute un hilo. Lo que yo tengo es un programa que lanza un hilo,en el metodo run del hilo,lo que hago es llamar a un metodo crearConexion al que le paso una direccion IP, entonces el metodo se conecta a esa direccion me devuelve los datos en un InputStream,procesa la respuesta y luego yo esos datos los transformo para quedarme con los que me interesa,transformarDatos. Eso lo hace todo bien,el problema le tengo cuando en una opcion de la interfaz grafica tengo puesto, que cuando de a un boton (ValoresActuales) me enseñe una lista con todas las direcciones ip que tengo y que cuando seleccione una me de los valores que haya en ese momento en la direccion. Esa operacion la realizo llamando a los mismos metodos que antes. Esos tres metodos les he puesto como synchronized para que solo se pueda tratar una direccion de una en
una. Yo entiendo que cuando de al boton ValoresActuales va a terminar de hacer todo lo referente a la direccion que habia leido primero y que luego,una vez que termine me va a dar los valores actuales de la direccion que he elegido y luego continuara con el programa. Pero el caso es que a mi no me lo hace,me sale excepcion java.lang.StringIndexOutOfBoundsException:String index out of range: -1 o java.lang.ArrayIndexOutOfBoundsException y otras veces se queda pillado. Comparto variables,pero cada vez que doy al boton de Valores Actuales las pongo a 0.Aqui dejo el codigo de los metodos:
Código PHP:
public synchronized static void crearConexion (String dirthrows IOException{
      
InputStream in=null;
      try{
          
URL ip= new URL(dir);
          
nombre_ip=ip.getHost();
          
HttpURLConnection ipConnection = (HttpURLConnectionip.openConnection();
         
          
ipConnection.setRequestMethod("GET");
           
          if (
ipConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
               
in ipConnection.getInputStream(); 
               
procesarRespuesta(ipConnection,in,dir);
               
in.close();
               
ipConnection.disconnect();
          }else
              if (
ipConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_IMPLEMENTED)
                  
conexion_automatas.tipoConexion=4;                       
              else 
                  if (
ipConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND)
                      
conexion_automatas.tipoConexion=3;
                
                
          
         
          
      }catch (
ConnectException ex){
          
excepcion=true;
          
System.out.println("Error al realizar la conexion.");
        
      }
               
  }
//fin public    
  
     
public synchronized static boolean procesarRespuesta(HttpURLConnection httpInputStream is,String dirthrows IOException {
       
        
String mensajeError null;
      
        
// 1) Obtener estado
        
if (http.getResponseCode() == HttpURLConnection.HTTP_OK) {
        
// 2) Obtener datos
            
int length = (int) http.getContentLength();
            
String str;
            if (
length != -1) {
                
byte datos[] = new byte[length];
                
is.read(datos);
                
str = new String(datos);
               
            } else { 
// longitud no disponible
                
ByteArrayOutputStream baos = new ByteArrayOutputStream();
                
int b;
                while ((
is.read()) != -1) {
                    
baos.write(b);//va escribiendo byte a byte(caracter a caracter)
                
}
                
str = new String(baos.toByteArray());//metemos en un string todos los bytes para poder tratarlo como una cadena
                
baos.close();
            }
            
// 3) Transformar Datos
        
            
if (Conexion.tipo==tipoH){
                   
conexion_hirschmann.transformar_datos(str);
            }
             else 
                if ((
Conexion.tipo==tipoA)){
                    if (
conexion_automatas.tipoConexion==3){
                   
                        if (
dir.trim().length()<=34)
                            
conexion_automatas.transformarDatosModule(str);
                        else
                            
conexion_automatas.transformarDatosDiagmon(str);
                    }
                    else
                        if (
conexion_automatas.tipoConexion==4){// T
                      
                            
if (dir.trim().length()<=39)
                                
conexion_automatas.transformarDatosDisplay(str);
                            else
                                
conexion_automatas.transformarDatosDisplay2(str);
                            
                        }
                        else{
//automatas Turismo,interfaz tipo 1
                           
if (dir.trim().length()<=31)
                                
conexion_automatas.transformarDatosHome(str);
                            else
                                
conexion_automatas.transformarDatosContadores(str);
                        }
                }
//if tipoA
        
} else {
            
mensajeError http.getResponseCode() + ": " http.getResponseMessage();
        }

        return (
http.getResponseCode() == HttpURLConnection.HTTP_OK);
    }

 public 
synchronized static void transformar_datos(String str) {
       
int i=0,j=0,p=0;//contadores
       
String str2,str3,str4,cadenaAencontrar,cadenaAreemplazar,cadenaAencontrar2;
  
long s 0;
   
         
//OBTENGO LOS DATOS
         
str=str.replaceAll("\n""-");//quito todos los retornos de carro de la cadena
         
str2 = new String();
         
//cadena que vamos a buscar
         
cadenaAencontrar = new String();

         
cadenaAencontrar"Late Coll.</th>";
      
         
i=str.indexOf(cadenaAencontrar,0);
         
//Extraemos la cadena que va desde la cadena a econtrar al final
         //en str2 tenemos la cadena desde donde quiero que empiecen los datos hasta el final
         
str2=str.substring(i+15);
             
         
//str3 me sirve para saber cual es la posicion final de lo que quiero copiar
         
str3 = new String();
         
cadenaAencontrar"<br><H4>Memory Ressources";
         
     
//j indice donde se encuentra el final de lo que quiero copiar
         
j=str.indexOf(cadenaAencontrar,0);
         
str3=str.substring(j-10);

         
//en str4 tengo la cadena final con los datos que necesito
         
str4= new String();
         
str4=str.substring(i+15j-10);  
          
         
//reemplazo del lenguaje html
         
cadenaAreemplazar = new String();
         
cadenaAreemplazar="<tr><th>";
         
String str5str4.replace(cadenaAreemplazar,"");//inicio fila
        
         
cadenaAreemplazar="</th></tr>";
         
String str6str5.replace(cadenaAreemplazar,"-");//fin de fila
        
         
cadenaAreemplazar="</th><th>";
         
String str8str6.replace(cadenaAreemplazar,"-");//separacion entre los datos
         
         
cadenaAreemplazar ="/";
         
String str7str8.replace(cadenaAreemplazar,"-");
        
             
         
StringTokenizer tokens = new StringTokenizer(str7,"\n");
             
         while(
tokens.hasMoreTokens()){
             
tokens.nextToken();//vamos al siguiente salto de linea
            
             
StringTokenizer tokens2=new StringTokenizer(str7"-");
                   
             while(
tokens2.hasMoreTokens()){//mientras haya guiones
                 
String w tokens2.nextToken(); //vamos al siguiente guion,en w guardo el dato
                
try{
                    
s=Long.parseLong(w);
           
crear_matriz(s);
                 }catch (
NumberFormatException e){} 
             }
         }
 
   } 

y la parte referente a cuando ya he presionado al boton es esta:
Código PHP:
    int tipo=0;
        if (
e.getSource() == btnValorAnterior)  {
                     
           try {
                  
String dirIp"http://"+listaDirecciones.getSelectedValue()+":/Info.html";
               
                 try {
                    
tipo=BaseDatos.getTipoMac(listaDirecciones.getSelectedValue().toString());
                } catch (
ClassNotFoundException ex) {
                    
Logger.getLogger(ListarDirecciones.class.getName()).log(Level.SEVEREnullex);
                } catch (
SQLException ex) {
                    
Logger.getLogger(ListarDirecciones.class.getName()).log(Level.SEVEREnullex);
                }
                  
                  
System.out.println(tipo);
                  
                  if (
tipo==tipoH){
                       
conexion_hirschmann.fila=0;
                       
conexion_hirschmann.columna=0;
                       
conexion_hirschmann.matriz=new long[18][16];
                      
Conexion.crearConexion(dirIp);
                  
                if (
Conexion.excepcion==false){
                   
                   
frame3.eliminarFila1();
                   
frame3.mostrarPortStatistics();
                   new 
frame3().setVisible(true);
                   
frame3.eliminarColumna1();
                }
                else {
                    
Conexion.excepcion=false;
                    
JOptionPane.showMessageDialog(rootPane"Error!!No se ha podido establecer conexion con dicha direccion.");
                }
                  }
            } catch (
IOException ex) {
                
Logger.getLogger(ListarDirecciones.class.getName()).log(Level.SEVEREnullex);
            }
        
          } 

Gracias

Saludos
  #2 (permalink)  
Antiguo 22/02/2012, 02:37
Avatar de godisa  
Fecha de Ingreso: noviembre-2011
Mensajes: 46
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: sincronizar metodos

nadie me puede ayudar??sino alguna ayuda de donde puedo encontrar buena informacion acerca de sincronizar hilos
  #3 (permalink)  
Antiguo 22/02/2012, 04:19
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: sincronizar metodos

En cuanto a la info de sincronizacion:

http://www.google.es/#sclient=psy-ab...w=1280&bih=885

(también puedes quitar el filetype para buscar páginas)

Con respecto a tus errores, mucho me temo que al hacer substrings de tipo str2=str.substring(i+15); estés accediendo a una posición que no existe en la cadena. Para ver eso deberías hacer debug con tu IDE y examinar los valores que toman las variables para saber donde se te produce el error exactamente.

Además puedes tener otros dos tipos de errores diferentes según lo que me has comentado, uno de ellos puede ser un bucle infinito o que se quede a la espera de que un hilo libere algún método y que no lo haga. Pero eso lo descubrirás también con el debug.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Etiquetas: jar, metodos, programa, sincronizar, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:08.