Pessoal, estou na última sessão da apostila Caelum FJ-11, mas uma dúvida surgiu.
A apostila apresenta o caso de duas Threads estarem acessando um mesmo objeto ao mesmo tempo (concorrência), e mudando atributos do mesmo, podendo gerar algumas inconsistência de acordo com a ordem de execução do escalonador.
Ele propoe um problema de uma conta bancária, onde uma Thread atualiza a taixa da conta, e outra permite que os clientes efetuem depositos e saques.
Nesse caso pode haver algum conflito se o sistema atualizar a tarifa de um cliente, e o mesmo efetuar um deposito no exato momento (tambem dependendo da ordem de execução do escalonador).
No entanto a apostila não implementa esse código, ela simplesmente apresenta a funcação synchronized que resguardar todos os parametros da classe (this), ou se quiser, somente algum(s) dele(s) para esses casos.
Minha dúvida então surgi ai, como toda Thread tem como ponto inicial o metodo Run que é obrigatório devido a interface Runnabl (ou Thread), como eu determino que a Thread x do objeto x vai efetuar um deposito, enquanto a Thread y do objeto x vai efetuar um ajuste de taxa?
Sei que posso mandar um parametro númerico para o metodo Run, e depois faço um switch, ou uma série de IFs para funilar o processo, porem gostaria de criar uma Thread direta do metodo da classe, entendem?
Eu tentei fazer isso aqui, usei o helper do eclipse, mas ele tenta mudar a sintaxe dos metodos para retornar um objeto Runnable… e não funciona.
Existe outra forma de resolver esse problema?
Muito grato,
Daniel
Segue código fonte:
[code]class Conta implements Runnable{
private double saldo;
// outros metodos e atributos...
public void atualiza(double taxa) {
synchronized (this) {
double saldoAtualizado = this.saldo * (1 + taxa);
this.saldo = saldoAtualizado;
}
}
public void deposita(double valor) {
synchronized (this) {
double novoSaldo = this.saldo + valor;
this.saldo = novoSaldo;
}
}
public class Threads {
public static void main(String[] args) {
Conta objConta = new Conta();
Thread threadConta = new Thread(objConta);
threadConta.start();
Thread threadContaAux = new Thread(objConta);
threadContaAux.start();
}
}
[/code]