【问题标题】:The wrong thread is the one sleeping错误的线程是睡觉的线程
【发布时间】:2013-09-17 17:46:36
【问题描述】:

我在主线程中有一个创建另一个线程的事件。这个新线程必须休眠 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 事件)。

【问题讨论】:

  • 您能否发布一个完整的可运行程序来重现该问题?
  • 我添加了整个班级。
  • 你能编辑你的问题来解释更多你得到的行为吗?主线程是在分叉另一个线程然后它就休眠了吗?
  • 你可以使用日志条目来追踪 main 花费时间的地方吗?

标签: java android multithreading events sleep


【解决方案1】:

问题在于,如果启动该线程,则 MainT 会休眠(即使我通过调试工具传递新坐标,也不会调用 GPS 事件)。

正如@Joni 所提到的,除非更新字符串值的synchronized 代码部分正在执行一些可能需要很长时间的复杂操作,否则很难看出 main 会在哪里休眠。会不会是 main 试图分叉 2 个线程,而第二个线程正在等待锁?如果您提供更多代码,我们可能会看到您的问题。

就在分叉线程和主线程之间共享st 值而言,您可以考虑使用AtomicReference<String> 之类的东西。这将允许您 set(...) 分叉线程中的值和 get() 主线程中的值而无需锁定。

【讨论】:

  • 其余代码只是管理android gps代码的主要活动(使用requestLocationUpdates()方法)。
  • 而且你肯定在锁中睡眠并且你肯定在线程上调用start()而不是run()? @AsAs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2012-08-08
  • 1970-01-01
  • 2011-11-10
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多