Problema com thread

4 respostas
S
é um problema simples não entendo o que estou a fazendo mal form que chama a thread e deveria mata-la tmb
private void formWindowActivated(java.awt.event.WindowEvent evt) {
        // TODO add your handling code here:
        jLabel1.setText(""+i);
        m= new MessageLoop(i);
        m.start();

    }

    private void formWindowClosed(java.awt.event.WindowEvent evt) {
        // TODO add your handling code here:
        m.kill=1;

    }
a class da thread
class MessageLoop extends Thread{

    String serverName = "127.0.0.1";
    long id = 0;
    ArrayList<String> myArr = new ArrayList<String>();
    String rmiName = "rmi://" + serverName + "/bullyservice";
    int kill=0;

    public int getKill() {
        return kill;
    }

    public void setKill(int kill) {
        this.kill = kill;
    }
    MessageLoop(int i) {
        id = i;
    }

    public void run() {

        //System.out.println(System.currentTimeMillis());
        try {
            bully c = (bully) Naming.lookup(rmiName);

            System.out.println("Connecting to: " + rmiName);

            inquery(c);

            int h = 0;
            while (h == 0 && kill==0) {
                try {
.....

4 Respostas

andreiribas

Enquanto a thread está executando voccê não consegue setar o valor na variável de instância kill.

Para resolver isso, faça um método synchronized para setar esse valor.

S

public synchronized void setKill(int kill) { this.kill = kill; }

e nao funciona nao sei porque

private void formWindowClosed(java.awt.event.WindowEvent evt) {
        // TODO add your handling code here:
        m.setKill(1);

    }
victorwss

O atributo kill deveria ser do tipo boolean (seria mais simples) E DEVERIA SER VOLATILE.

Atributos que forem acessados de Threads diferentes ou devem ser volatiles ou devem sempre ser acessados dentro de blocos synchronized que sincronizem em um mesmo objeto. Por isso que colocar synchronized no getKill() e no setKill() não resolve, pois o atributo ainda é acessado no método run() fora de um bloco synchronized.

O java frequentemente faz caches de objetos específicas para cada Thread. Isso ajuda o programa a ficar mais rápido. No entanto, quando os atributos são acessados de Threads distintas, esse esquema de cache específica para cada Thread acaba criando problemas de visibilidade, aonde cada Thread vê e manipula um valor diferente, o que obviamente acaba por criar bugs muito estranhos e obscuros. O modificador volatile serve exatamente para dizer para a JVM “não faça cache disso aqui”, e assim esse problema se resolve. A outra forma é acessar o atributo SEMPRE de dentro de blocos synchronized, pois a sincronização força a a atualização das caches e garante que apenas uma Thread de cada vez vá manipular aquele atributo de cada vez. No entanto o uso de synchronized é mais pesado do que o de volatile.

S

vou tentar obrigado pela explicação foi muito boa

Criado 23 de janeiro de 2010
Ultima resposta 24 de jan. de 2010
Respostas 4
Participantes 3