Java 错误的线程是正在睡觉的线程
我在主线程中有一个创建另一个线程的事件。这个新线程必须休眠60秒,然后必须检查主线程状态。我的代码是:Java 错误的线程是正在睡觉的线程,java,android,multithreading,events,sleep,Java,Android,Multithreading,Events,Sleep,我在主线程中有一个创建另一个线程的事件。这个新线程必须休眠60秒,然后必须检查主线程状态。我的代码是: public class Act extends Activity { Object lock=new Object(); public class MainT implements LocationListener { public String str=""; public void onLocationChanged(Location
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事件)
问题是,如果启动了该线程,则是MainT休眠(即使我通过调试工具传递了新坐标,也不会调用GPS事件)
正如@Joni所提到的,除非更新字符串值的synchronized
代码部分正在执行一些可能需要很长时间的复杂操作,否则很难看到main将睡在哪里。可能是main正在尝试分叉两个线程,而第二个线程正在等待锁吗?如果您提供更多的代码,我们可能会看到您的问题
在分叉线程和主线程之间共享<代码> ST <代码>值时,您可能会考虑一些类似的。这将允许您
设置(…)
分叉线程中的值,以及get()
主线程中的值,而无需锁定。您可以发布一个完整的可运行程序来重现该问题吗?我添加了整个类。您可以编辑您的问题来进一步解释您得到的行为吗?主线程是否会分叉另一个线程然后休眠?您可以使用日志条目跟踪主线程在哪里花费时间吗?其余代码只是管理android gps代码的主要活动(使用requestLocationUpdates()
方法)。而且您肯定没有在锁中睡眠,您肯定是在线程上调用start()
,而不是run()
@以及