我正在尝试使用信号量使线程等待信号量在其外部发生的事情,但我不知道为什么它不起作用。可能是我不知道的关于Android信号量的东西,因为我已经使用了与一些实时操作系统(例如FreeRTOS和MXLite)相同的“操作方式”,并且它工作正常。
实际上我每次在run()方法中执行while循环时都有一个运行服务的线程。服务执行一些长操作然后死掉,我只是希望线程在前一个服务完成之前不运行新服务。
代码看起来像那样(condLog只是一个函数,如果DEBUG定义为true,则传递一个字符串传递给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 - Semaphore发布,信号量许可证:2
为什么是2而不是1?看起来我不会发布我正在获取的信号量......
真的,任何帮助都会有所帮助和赞赏。
非常感谢你们 克里斯蒂
答案 0 :(得分:0)
Semaphore
必须消极才能阻止。在这种情况下,您可以使用CountDownLatch
。如果我没有误解你,它应该更适合你的需要。