Android-如何避免两个RunNuithRead调用之间的死锁
我有一个过程,根据用户是否插入或弹出内存笔驱动器,它会运行一些“如果”:Android-如何避免两个RunNuithRead调用之间的死锁,android,multithreading,deadlock,Android,Multithreading,Deadlock,我有一个过程,根据用户是否插入或弹出内存笔驱动器,它会运行一些“如果”: int userStatus = StopActivity.USER_HAS_NEVER_INSERTED_MEMORY; while (true) { File usbDirectoryFile = new File(usbDirectory); if (usbDirectoryFile.exists()) { verMasInfoDirectory = usbDirectory
int userStatus = StopActivity.USER_HAS_NEVER_INSERTED_MEMORY;
while (true) {
File usbDirectoryFile = new File(usbDirectory);
if (usbDirectoryFile.exists()) {
verMasInfoDirectory = usbDirectory + File.separator + "vermasinfo";
File verMasInfoDirectoryFile = new File(verMasInfoDirectory);
if (verMasInfoDirectoryFile.exists()) {
break;
} else if (userStatus != StopActivity.USER_HAS_BEEN_NOTIFIED) {
userStatus = StopActivity.USER_HAS_BEEN_NOTIFIED;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(StopActivity.this, R.string.stop_activity_directory_not_exists_toast_text, Toast.LENGTH_LONG).show();
}
});
}
} else if (userStatus == StopActivity.USER_HAS_BEEN_NOTIFIED) {
userStatus = StopActivity.USER_HAS_NOT_BEEN_NOTIFIED;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(StopActivity.this, R.string.stop_activity_ejected_memory_toast_text, Toast.LENGTH_LONG).show();
}
});
}
usbDirectoryFile = null;
}
问题是,当用户快速插入/弹出笔驱动器时,对runOnUIThread的两个调用都可能导致死锁
我怎样才能避免这种僵局
提前感谢。这些呼叫不会导致死锁。首先,它们由系统一次运行一个。也就是说,一个运行(在事件线程上)直到完成(直到
run()
方法返回),然后另一个退出队列并由事件线程运行。其次,可运行程序没有锁定资源,因此没有死锁的原因
可能您担心屏幕上同时出现两个Toast
s(因为每个Toast
在show()
返回后会显示一段时间)。唯一的问题是一个会隐藏另一个;然而,仍然没有出现僵局
如果你的应用程序死锁,问题就在别处。在你的回答之后(忽略死锁),我在while结束之前添加了一个
线程。sleep(100)
,现在可以完美地工作了。让我们明确一点:你知道为什么在很多情况下,睡眠会起作用吗?@Jorgesmash-我怀疑你的循环将可运行程序放入事件线程队列的速度比它们被消耗的速度快得多,最终会淹没系统。我不太确定您希望循环做什么,但是如果我正确地跟踪它,它会以尽可能快的速度弹出,等待一些文件出现。我不知道这样做的目的是什么,但它似乎不是通知用户某些事情的正确方法。