1

它是一个 RMI 服务器对象,可能会运行很多 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;
    }

}
4

2 回答 2

4

使用 ExecutorService。ExecutorService 将创建一个线程,您可以根据需要多次向它们提交可运行文件。

ExecutorService service = Executors.newSingleThreadExecutor();

然后在你的代码中

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

同样为了正确起见,您正在不安全地写入 humanActivity 字段。存在过时读取的可能性。有很多关于可见性的文章,您可以在此处查看

于 2011-01-04T19:37:20.217 回答
2

Thread.interrupt()中断等待,Thread.join()等待线程完成后再继续。

于 2011-01-04T19:19:05.210 回答