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 に答える