Android Semaphores停止一个帖子

时间:2014-01-06 14:52:45

标签: android semaphore

我正在尝试使用信号量使线程等待信号量在其外部发生的事情,但我不知道为什么它不起作用。可能是我不知道的关于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?看起来我不会发布我正在获取的信号量......

真的,任何帮助都会有所帮助和赞赏。

非常感谢你们 克里斯蒂

1 个答案:

答案 0 :(得分:0)

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