Aqui les dejo un ejemplo de como sincronizar un metodo que esta sindo utilizado por dos hilos "Simultaneamente" es muy bueno...
solo debemos crear una clase llamada Cajero, copias y pegas este codigo y listo...
/**
*
* @author Jeison Nisperuza
*/
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.io.PrintWriter;
import javax.swing.JOptionPane;
public class Cajero extends Applet implements ActionListener{
static int balance =0;
int saldoini=0;
int vconsigna1=0;
int vconsigna2=0;
//declaracion de componentes:
Button boton1 = new Button("CONSIGNACION MULTIPLE");
TextField cuenta1 = new TextField(10);
TextField cuenta2 = new TextField(10);
static TextArea ta = new TextArea(20,20);
Label l1 = new Label("Monto Consig 1.");
Label l2 = new Label("Monto Consig 2.");
Label l3 = new Label("Progreso...");
public void init(){
//implemento los componentes:
setLayout(new GridLayout(0,1));
add(l1);
add(cuenta1);
add(l2);
add(cuenta2);
add(l3);
add(ta);
ta.setFocusable(false);
add(boton1);
//escucho los botones (la accion):
saldoini =Integer.parseInt(JOptionPane.showInputDialog("Digite su Saldo inicial"));
boton1.setForeground(Color.blue);
boton1.addActionListener(this);
}
public void MontoTransac(int mtransac) {
try { // simulo el retraso
Thread.sleep(500);
} catch (InterruptedException e) {}
Cajero.balance = mtransac;
}
public void EjecTransaccionC() {
MontoTransac(saldoini);
//valido
vconsigna1 =Integer.parseInt(cuenta1.getText());
vconsigna2 =Integer.parseInt(cuenta2.getText());
PrintWriter salida = new PrintWriter(System.out, true);
cuenta monto = new cuenta (salida);
Movimiento mov1, mov2;
mov1 = new Movimiento (monto, vconsigna1, "mc1>.");
mov2 = new Movimiento (monto, vconsigna2, "mc2>.");
//iniciar consignacion
mov1.start();
mov2.start();
// espero que finalice la transaccion
try {
mov1.join();
mov2.join();
}
catch (InterruptedException a) {
System.out.println(a);
}
//muestro el balance final
Cajero.ta.append("***** El balance final es: " + balance+" *****");
saldoini=balance;
}
//accion
public void actionPerformed(ActionEvent e){
//boton de consignar
if (e.getSource().equals(boton1)){
ta.setText("");
if (cuenta1.getText().equals("")){
JOptionPane.showMessageDialog(null, "Es necesario colocar los valores $ del monto");
cuenta1.requestFocus();
}
else
if (cuenta2.getText().equals("")) {
JOptionPane.showMessageDialog(null, "Es necesario colocar los valores $ del monto");
cuenta2.requestFocus();
}
else
EjecTransaccionC();
}
}
}
class cuenta {
PrintWriter salida;
cuenta (PrintWriter vsalida) {
this.salida = vsalida;
}
synchronized void deposito (int monto, String trans) {
int balance;
Cajero.ta.append(trans + " guardando deposito " + monto+"\n");
Cajero.ta.append(trans + " obteniendo balance..."+"\n");
balance = ObtenerBalance();
Cajero.ta.append(trans + " balance encontrado " + balance+"\n");
balance+= monto;
Cajero.ta.append(trans + " ajuste del balance..."+"\n");
ModificarBalance(balance);
Cajero.ta.append(trans + " nuevo balance establecido en " + Cajero.balance+"\n");
}
int ObtenerBalance() {
try { //simular retraso
Thread.sleep(5000);
} catch (InterruptedException e) {}
return Cajero.balance;
}
void ModificarBalance (int balance) {
try { // simular retraso
Thread.sleep(5000);
} catch(InterruptedException e) {}
Cajero.balance = balance;
}
}
// clase de los hilos
class Movimiento extends Thread
{
cuenta vcuenta;
int montoconsig;
String message;
Movimiento (cuenta vcuenta, int vmonto, String message) {
this.message = message;
this.vcuenta = vcuenta;
this.montoconsig = vmonto;
}
public void run () {
vcuenta.deposito (montoconsig, message);
}
}
deja tu comentario o agradecimiento...
Comentarios
Publicar un comentario