Question

Il est un objet serveur RMI, tant sethumanActivity () peut être exécuté, comment puis-je faire que le fil de changeToFalse précédent sera l'arrêt ou l'arrêt avant que la nouvelle course changeToFalse? t. interrupt?

En fait quand sethumanActivity () Invoke, la humanActivity sera définie sur true, mais un fil sera exécuté pour le remettre à false. Mais je pense à la façon de désactiver ou de tuer le fil lorsqu'un autre sethumanActivity () invoquée?

public class VitaminDEngine implements VitaminD {

    public boolean humanActivity = false;
    changeToFalse cf = new changeToFalse();
    Thread t = new Thread(cf);


    private class changeToFalse implements Runnable{

        @Override
        public void run() {
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            humanActivity = false;
        }

    }

    @Override
    public void sethumanActivity() throws RemoteException {
        // TODO Auto-generated method stub
        humanActivity = true;
        t.start();
    }

    public boolean gethumanActivity() throws RemoteException {
        // TODO Auto-generated method stub
        return humanActivity;
    }

}

Edité après l'aide de Soer

package smartOfficeJava;

import java.rmi.RemoteException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class VitaminDEngine implements VitaminD {

    public volatile boolean humanActivity = false;
    changeToFalse cf = new changeToFalse();
    ExecutorService service = Executors.newSingleThreadExecutor();


    private class changeToFalse implements Runnable{

        @Override
        public void run() {
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            humanActivity = false;
        }

    }

    @Override
    public synchronized  void sethumanActivity() throws RemoteException {
        humanActivity = true;
        service.submit(cf);
    }

    public synchronized  boolean gethumanActivity() throws RemoteException {
        return humanActivity;
    }

}
Était-ce utile?

La solution

Utilisez un ExecutorService. Le ExecutorService va créer un seul thread et vous pouvez soumettre runnables les autant de fois que vous le souhaitez.

ExecutorService service = Executors.newSingleThreadExecutor();

Ensuite, dans votre code

@Override
public void sethumanActivity() throws RemoteException {
    // TODO Auto-generated method stub
    humanActivity = true;
   service.submit(cf);
}

De même pour le bien de l'exactitude, vous écrivez au champ unsafely de humanActivity. Il y a la possibilité de lire rassis. Il y a beaucoup d'articles qui parlent d'une visibilité, vous pouvez consulter ici .

Autres conseils

pauses Thread.interrupt() attend, attend Thread.join() pour un fil à la fin avant de continuer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top