Java 线程状态监视器。如何调试这个?什么';是什么原因造成的?
我正在Android上开发,我不明白为什么我的一些线程会进入“监控”状态。我已经读过,这可能是因为“同步”问题,但我不确定一个对象如何不会释放它们的锁 有人能帮我调试一下吗?或者你看到我做错了什么吗?这是一个同步对象没有被释放的问题,还是我的加载没有正确超时并锁定所有线程 下面是我如何使用synchronized的Java 线程状态监视器。如何调试这个?什么';是什么原因造成的?,java,android,multithreading,synchronization,threadpool,Java,Android,Multithreading,Synchronization,Threadpool,我正在Android上开发,我不明白为什么我的一些线程会进入“监控”状态。我已经读过,这可能是因为“同步”问题,但我不确定一个对象如何不会释放它们的锁 有人能帮我调试一下吗?或者你看到我做错了什么吗?这是一个同步对象没有被释放的问题,还是我的加载没有正确超时并锁定所有线程 下面是我如何使用synchronized的 private Bitmap getFromSyncCache(String url) { if (syncCache == null) return null;
private Bitmap getFromSyncCache(String url) {
if (syncCache == null) return null;
synchronized (syncCache) {
if (syncCache.hasObject(url)) {
return syncCache.get(url);
} else {
return null;
}
}
}
在这里:
bitmapLoader.setOnCompleteListener(new BitmapLoader.OnCompleteListener() {
@Override
public void onComplete(Bitmap bitmap) {
if (syncCache != null) {
synchronized (syncCache) {
syncCache.put(bitmapLoader.getLoadUrl(), bitmap);
}
}
if (asyncCache != null) addToAsyncCache(bitmapLoader.getLoadUrl(), bitmap);
if (onCompleteListener != null) onCompleteListener.onComplete(bitmap);
}
});
这是我的缓存
public class MemoryCache<T> implements Cache<T>{
private HashMap<String, SoftReference<T>> cache;
public MemoryCache() {
cache = new HashMap<String, SoftReference<T>>();
}
@Override
public T get(String id) {
if(!cache.containsKey(id)) return null;
SoftReference<T> ref = cache.get(id);
return ref.get();
}
@Override
public void put(String id, T object) {
cache.put(id, new SoftReference<T>(object));
}
@Override
public void clearCache() {
cache.clear();
}
@Override
public boolean hasObject(String id) {
return cache.containsKey(id);
}
检查是否确实是死锁的一种方法是使用Android Studio的调试器: 查看线程,右键单击处于“监视”状态的线程,然后单击“挂起”。调试器将带您进入代码中线程被卡住的行
当我调试死锁时,两个线程都在等待同步语句 是否发生了实际问题(例如死锁)或代码运行正常?上面用红色圈起来的“monitor”线程状态不是意味着死锁吗?我的意思是,在运行应用程序时(没有调试)是否真的发生了死锁?是(填充1234567890空间)这是什么<代码>状态=state.COMPLETE;如果(state!=state.cancelled){
private void threadedLoad(String url) {
cancel();
bytesLoaded = 0;
bytesTotal = 0;
try {
state = State.DOWNLOADING;
conn = (HttpURLConnection) new URL(url).openConnection();
bytesTotal = conn.getContentLength();
// if we don't have a total can't track the progress
if (bytesTotal > 0 && onProgressListener != null) {
// unused
} else {
conn.connect();
inStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inStream);
state = State.COMPLETE;
if (state != State.CANCELED) {
if (bitmap != null) {
msgSendComplete(bitmap);
} else {
handleIOException(new IOException("Skia could not decode the bitmap and returned null. Url: " + loadUrl));
}
}
try {
inStream.close();
} catch(Exception e) {
}
}
} catch (IOException e) {
handleIOException(e);
}
}