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 dir) throws IOException{
InputStream in=null;
try{
URL ip= new URL(dir);
nombre_ip=ip.getHost();
HttpURLConnection ipConnection = (HttpURLConnection) ip.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 http, InputStream is,String dir) throws 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 ((b = 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+15, j-10);
//reemplazo del lenguaje html
cadenaAreemplazar = new String();
cadenaAreemplazar="<tr><th>";
String str5= str4.replace(cadenaAreemplazar,"");//inicio fila
cadenaAreemplazar="</th></tr>";
String str6= str5.replace(cadenaAreemplazar,"-");//fin de fila
cadenaAreemplazar="</th><th>";
String str8= str6.replace(cadenaAreemplazar,"-");//separacion entre los datos
cadenaAreemplazar ="/";
String str7= str8.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.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(ListarDirecciones.class.getName()).log(Level.SEVERE, null, ex);
}
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.SEVERE, null, ex);
}
}
Gracias
Saludos