comment redémarrer un thread?
-
15-10-2019 - |
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;
}
}
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.