Android信号量停止线程

Posted

技术标签:

【中文标题】Android信号量停止线程【英文标题】:Android Semaphores to stop a thread 【发布时间】:2014-01-06 14:52:44 【问题描述】:

我正在尝试使用信号量使线程等待在信号量之外发生的事情,但我不知道为什么它不起作用。可能是我对 android 信号量一无所知的事情,因为我已经在某些实时操作系统(例如 FreeRTOS 和 MXLite)上使用了相同的“操作方式”,并且效果很好。

实际上,我有一个线程在其 run() 方法中每次执行 while 循环时都在运行服务。服务执行了一些长时间的操作然后死掉,我只是希望线程在前一个服务完成之前不要运行新服务。

代码看起来是这样的(condLog 只是一个函数,如果 DEBUG 定义为真,则使用传递的字符串执行 Log.i):

 public Handler handler = new Handler() 
     @Override
     public void handleMessage(Message msg) 
         super.handleMessage(msg);
         startScheduler(msg);
     
 ;

 private static boolean serviceRunning = false;
 private static Context context; // context is set in the main class contructor
 private executeScheduledAction myThread = new executeScheduledAction();

 private void startScheduler(Message msg) 
    condLog("startScheduler- message received...");
    myThread .releaseSemaphore();
 

 private final class executeScheduledAction extends Thread 
    private final static int MAX_CONCURRENT = 1;
    private Semaphore semaphore = new Semaphore(MAX_CONCURRENT, true);
    public executeScheduledAction () 
    public void releaseSemaphore() 
        semaphore.release();
        condLog("releaseSemaphore - Semaphore released, semaphore permit: " + semaphore.availablePermits());
    
    @Override
    public void run() 
        condLog( "executeScheduledAction - thread started...");
        serviceRunning = true;
        while(serviceRunning )
            try 
                condLog( "executeScheduledAction - taking semaphore, semaphore permits: " + semaphore.availablePermits() );
                semaphore.acquire(); 
             catch (InterruptedException e) 
                e.printStackTrace();
            
            condLog("executeScheduledAction - semaphore taken, running service");
            // HERE RUN THE SERVICE
        
        condLog( "Thread finished...");
    

首先调用myThread.start 方法。正如我所料,信号量是第一次获取并且服务正确启动。最后,服务向调用 executeScheduledAction.release 的处理程序发送消息......这就是我在 Logcat 中获得的:

executeScheduledAction - 线程启动...

executeScheduledAction - 获取信号量,信号量许可:1

executeScheduledAction - 获取信号量,运行服务

executeScheduledAction - 获取信号量,信号量许可:0

startScheduler - 收到消息...

releaseSemaphore - 信号量释放,信号量许可:2

为什么是 2 而不是 1?看起来我没有释放我正在获取的相同信号量......

真的,任何帮助都会有所帮助和感激。

非常感谢大家 克里斯蒂亚诺

【问题讨论】:

【参考方案1】:

Semaphore 必须变为否定才能被阻止。在这种情况下,您可以使用CountDownLatch。如果我没有误解你,它应该更适合你的需求。

【讨论】:

感谢您的回答,但我认为这不是问题所在。正如您在 LogCat 行中看到的“...获取信号量,信号量许可:0”,当许可为“0”时信号量阻塞(好的,在获取后它们变为 -1)。问题是信号量被许可 0 阻塞,但是当我释放时,我读取许可 = 2,这是我无法理解的。此外,当我发布时线程执行并没有开始,这产生了我没有释放我正在获取的相同信号量的想法,我不知道为什么。顺便说一句,我会看看 CountDownLatch,确定,谢谢。

以上是关于Android信号量停止线程的主要内容,如果未能解决你的问题,请参考以下文章

Android如何停止线程的方式

一起Talk Android吧(第三百六十一回:多线程之停止线程)

如何在android中停止异步任务线程?

Android - 停止线程的最佳和安全方法

如何在android中安全地停止线程? [复制]

QThread 不会停止/不处理信号