2

次のコードがあります。

public class Shell {
  String status;
  Runtime rtime;
  Process process;

  public void runCmd(final String cmd,String status) throws Exception{
     this.status = status;
     Thread t = new Thread(new Runnable() {
           @Override
           public void run() {
              try {
                 process = rtime.exec(cmd);
                 process.waitFor();
                 this.status = "check out done";
             } catch (IOException e) {

             } catch (InterruptedException e) {

             }
          }
    });

    t.start();

  }

}

しかし、Java では、新しいスレッド t 内の変数を変更することはできません。statusある種のスレッド間通信が必要なのかもしれません。スレッドが初めてなので、これを行う方法を教えてください。

4

3 に答える 3

3

あなたの場合this、式this.statusはステータスフィールドが定義されていないRunnableオブジェクトを参照しています。Shell.this.statusの代わりに試してくださいthis.status

于 2013-09-19T10:29:41.830 に答える
1
public class Shell {
    volatile String status;

    public void runCmd(final String cmd) throws Exception{
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Process process = Runtime.getRuntime().exec(cmd);
                    process.waitFor();
                    Shell.this.status = "check out done";
                } catch (IOException e) {

                } catch (InterruptedException e) {

                }
            }
        });

        t.start();
        t.join();
        System.out.println(status);

    }
}

値を使用Shell.this.statusして、必要なものに更新します。

スレッドセーフ

volatile参照が別のスレッドから更新されたときに常に使用します。

于 2013-09-19T10:40:04.643 に答える