-1

別のスレッドを作成するメイン スレッドにイベントがあります。この新しいスレッドは 60 秒間スリープしてから、メイン スレッドの状態を確認する必要があります。私のコードはこれです:

public class Act extends Activity {
    Object lock=new Object();
    public class MainT implements LocationListener {
         public String str="";
         public void onLocationChanged(Location location) {
              synchronized(lock) {
                   str=String.valueOf(location.getLatitude())+" "+String.valueOf(location.getLongitude());
                   new SecondT(str).start();
              }
         }

         class SecondT extends Thread {
              public String st;
              SecondT(String s) {
                   st=s;
              }

              public void run() {
                   waitSeconds();
              }

              public void waitSeconds() {
                   try {
                        Thread.sleep(60000);
                        synchronized(lock) {
                             if (str.equals(st))
                             Log.d("SecondT", "Same string.");
                        }
                   } catch (InterruptedException e) {
                        e.printStackTrace();
                   }
              }
         }

        @Override
        public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub
        }
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LocationManager locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        MainT mt = new MainT();
        locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 50, mt);
    }
}

問題は、そのスレッドを開始すると、MainT がスリープ状態になることです (デバッグ ツールを介して新しい座標を渡しても、GPS イベントは呼び出されません)。

4

1 に答える 1

1

問題は、そのスレッドを開始すると、MainT がスリープ状態になることです (デバッグ ツールを介して新しい座標を渡しても、GPS イベントは呼び出されません)。

@Joniが言及しているようにsynchronized、文字列値を更新するコードのセクションが長い時間がかかる可能性のある複雑な操作を実行していない限り、メインがどこでスリープするかを確認するのは困難です。メインが2つのスレッドをフォークしようとしていて、2番目のスレッドがロックを待っている可能性がありますか? さらにコードを提供すると、問題を確認できる場合があります。

stforked-thread とメイン スレッドの間で値を共有するという点では、 AtomicReference<String>. これによりset(...)、フォークされたスレッドget()の値とメインの値をロックせずに使用できるようになります。

于 2013-09-17T17:59:09.670 に答える