【发布时间】: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?看起来我没有释放我正在获取的相同信号量......
真的,任何帮助都会有所帮助和感激。
非常感谢大家 克里斯蒂亚诺
【问题讨论】: