как перезапустить тему? - PullRequest
1 голос
/ 04 января 2011

Это объект 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;
    }

}

Ответы [ 2 ]

4 голосов
/ 04 января 2011

Используйте ExecutorService.ExecutorService создаст единый поток, и вы сможете отправлять им исполняемые файлы столько раз, сколько захотите.

ExecutorService service = Executors.newSingleThreadExecutor();

Затем в вашем коде

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

Также для правильностивы небезопасно пишете в поле HumanActivity.Существует возможность несвежего чтения.Есть много статей, в которых говорится о видимости, одну из которых вы можете проверить здесь .

2 голосов
/ 04 января 2011

Thread.interrupt() breaks ждет, Thread.join() ожидает завершения потока, прежде чем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...