Это объект RMI Server, поэтому может быть запущено так много sethumanActivity (), как мне убедиться, что предыдущий поток changeToFalse будет остановлен или остановлен до запуска нового changeToFalse?t. interrupt
?
В основном, когда вызывается sethumanActivity (), для humanActivity будет задано значение true, но будет запущен поток, чтобы вернуть его в значение false.Но я думаю о том, как отключить или убить поток, когда другой sethumanActivity () вызывается?
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;
}
}
Отредактировано после помощи 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;
}
}