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信号量停止线程的主要内容,如果未能解决你的问题,请参考以下文章