Android - 如何避免两个 runOnUIThread 调用之间的死锁

标签 android multithreading deadlock

我有这个过程,根据用户是否插入或弹出内存笔驱动器运行一些“if”:

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(因为每个 Toastshow()< 后都会显示一段时间 返回)。这样做的唯一问题是,一个人会隐藏另一个人。但是,仍然没有出现僵局。

如果您的应用出现死锁,则问题出在其他地方。

关于Android - 如何避免两个 runOnUIThread 调用之间的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14767354/

相关文章:

Python dict.get() 锁

java线程暂停、优雅结束并中止

c - 如何知道线程是否处于死锁状态?

go - 所有 goroutine 都处于休眠状态 - 死锁

visual-studio - Visual Studio 在构建期间不断挂起

Android 支持 v4 SwipeRefreshLayout 空 View 问题

c++ - 在 Qt 中线程化一个函数

android - 在 Android 12 启动画面结束之前 fragment 被初始化

android - 使用 starling 缩放 Android 设备会导致一些布局问题

android - 避免禁用证书固定 Android