java线程状态监视器如何调试?是什么引起的?

fjaof16o  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(356)

我是在android上开发的,我不明白为什么我的一些线程会进入“监视”状态。我读过,这可能是因为一个“同步”的问题,但我不知道一个对象如何不会释放他们的锁。
有人能帮我调试一下吗?或者你看到我做错什么了吗?是因为同步对象没有被释放,还是我的加载没有正确超时并锁定所有线程?

下面是我如何使用synchronized。

  1. private Bitmap getFromSyncCache(String url) {
  2. if (syncCache == null) return null;
  3. synchronized (syncCache) {
  4. if (syncCache.hasObject(url)) {
  5. return syncCache.get(url);
  6. } else {
  7. return null;
  8. }
  9. }
  10. }

在这里:

  1. bitmapLoader.setOnCompleteListener(new BitmapLoader.OnCompleteListener() {
  2. @Override
  3. public void onComplete(Bitmap bitmap) {
  4. if (syncCache != null) {
  5. synchronized (syncCache) {
  6. syncCache.put(bitmapLoader.getLoadUrl(), bitmap);
  7. }
  8. }
  9. if (asyncCache != null) addToAsyncCache(bitmapLoader.getLoadUrl(), bitmap);
  10. if (onCompleteListener != null) onCompleteListener.onComplete(bitmap);
  11. }
  12. });

这是我的储藏室

  1. public class MemoryCache<T> implements Cache<T>{
  2. private HashMap<String, SoftReference<T>> cache;
  3. public MemoryCache() {
  4. cache = new HashMap<String, SoftReference<T>>();
  5. }
  6. @Override
  7. public T get(String id) {
  8. if(!cache.containsKey(id)) return null;
  9. SoftReference<T> ref = cache.get(id);
  10. return ref.get();
  11. }
  12. @Override
  13. public void put(String id, T object) {
  14. cache.put(id, new SoftReference<T>(object));
  15. }
  16. @Override
  17. public void clearCache() {
  18. cache.clear();
  19. }
  20. @Override
  21. public boolean hasObject(String id) {
  22. return cache.containsKey(id);
  23. }

我就是这样从网上加载图像的:

  1. private void threadedLoad(String url) {
  2. cancel();
  3. bytesLoaded = 0;
  4. bytesTotal = 0;
  5. try {
  6. state = State.DOWNLOADING;
  7. conn = (HttpURLConnection) new URL(url).openConnection();
  8. bytesTotal = conn.getContentLength();
  9. // if we don't have a total can't track the progress
  10. if (bytesTotal > 0 && onProgressListener != null) {
  11. // unused
  12. } else {
  13. conn.connect();
  14. inStream = conn.getInputStream();
  15. Bitmap bitmap = BitmapFactory.decodeStream(inStream);
  16. state = State.COMPLETE;
  17. if (state != State.CANCELED) {
  18. if (bitmap != null) {
  19. msgSendComplete(bitmap);
  20. } else {
  21. handleIOException(new IOException("Skia could not decode the bitmap and returned null. Url: " + loadUrl));
  22. }
  23. }
  24. try {
  25. inStream.close();
  26. } catch(Exception e) {
  27. }
  28. }
  29. } catch (IOException e) {
  30. handleIOException(e);
  31. }
  32. }
chy5wohz

chy5wohz1#

检查是否确实是死锁的一种方法是使用androidstudio的调试器:查看线程,右键单击处于“监视”状态的线程,然后单击“挂起”。调试器会将您带到代码中线程卡住的那一行。

当我调试死锁时,两个线程都在等待同步语句。

相关问题