有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何按条件唤醒线程

当然,我有一个活动在UI线程上运行,还有另一个线程在后台运行,并使用Handler post方法(通过looper)与活动通信
当屏幕被打开或应用程序被隐藏时,它会继续工作
所以我需要在onPause方法中停止这个线程,并在onResume方法中唤醒它
在我的线程中,我有条件暂停或停止它
如何在onPause方法中使线程休眠。在活动再次出现后唤醒它
我可以使用monitor调用wait方法来处理一个对象,然后在这个对象上通知
但这是个好办法吗?或者有另一种优雅的方式


共 (2) 个答案

  1. # 1 楼答案

    停止/恢复该线程之外的线程是一种不好的做法。线程必须自行决定何时运行和何时停止。因此,后台线程应该定期检查其工作是否仍然需要,而客户机(前台)线程应该发出一些相关信号。 发出信号的一种方法是将信号形成为Runnable类型的作业,然后在线程池中执行它们。因此,当活动休眠时,它不会发出信号

    当后台线程想要更新UI时,主要问题是目标Activity可能会被关闭(或在重新创建的过程中),而更新任务会失败。AcyncTask类不能解决这个问题。正确的解决方案发布在my Github workspace。但是在使用这个或其他解决方案之前,如果你真的需要背景线程,请三思。最好的方法是根本不使用后台线程,直接在UI线程上进行所有UI更新。当然,如果更新来自网络,那么必须使用后台线程

  2. # 2 楼答案

    听起来是使用旋转栅门的好地方。使用一个许可证初始化信号灯:

    Semaphore turnstile = new Semaphore(1);
    

    让你的背景活动定期通过旋转栅门,就像这样:

    turnstile.acquire();
    turnstile.release();
    

    当前景线程希望背景线程在旋转栅门处暂停时,它可以锁定旋转栅门:

    turnstile.acquire();
    

    当前台线程希望后台线程重新开始工作时,它可以解锁旋转栅门()

    turnstile.release();
    

    好的软件工程实践是将整个过程封装在一个Turnstile类中,并为前台和后台线程调用适当命名的方法。我将把它作为练习留给读者