【问题标题】:reader-writer task-queue in AndroidAndroid中的读写器任务队列
【发布时间】:2016-08-30 04:47:36
【问题描述】:

我正在使用 reading taskswriting tasks 制作一个 android 应用程序。 我想得到以下行为:

  • 任务在队列中执行
  • 读取任务可以同时运行。
  • 写作任务非常重要,不能同时运行,如果正在运行一个写作任务就不能运行任何其他任何类型的任务

我正在搜索解决此问题的库。 我可以用信号量解决这个问题,但我害怕在 android 中解决这些问题。 在我对 android 的有限经验中,我知道管理这些东西的生命周期非常困难。并且正确执行编写任务非常重要。

对不起我的英语。谢谢

【问题讨论】:

  • 先用java做

标签: java android concurrency task-queue


【解决方案1】:

为您的任务使用fixed thread pool executor,让您的所有任务使用相同的ReadWriteLock,然后让它自行解决。一般示例:

public class ReadTask implements Runnable {        
    private final ReadWriteLock lock;
    public ReadTask (ReadWriteLock lock) {
        this.lock = lock;
    }
    @Override public void run () {
        lock.readLock().lock();
        // do stuff
        lock.readLock().unlock();
    }
}

public class WriteTask implements Runnable {
    private final ReadWriteLock lock;
    public WriteTask (ReadWriteLock lock) {
        this.lock = lock;
    }
    @Override public void run () {
        lock.writeLock().lock();
        // do stuff
        lock.writeLock().unlock();
    }
}

然后,设置您的初始执行程序并锁定:

ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
ReadWriteLock lock = new ReentrantReadWriteLock();

当你想要排队任务时:

// a write task:    
executor.execute(new WriteTask(lock));

// a read task:
executor.execute(new ReadTask(lock));

只要确保你总是打开锁;如有必要,您可以使用 try ... finally 块,但实际上,因为 run() 不应该抛出任何异常,所以如果您按照应有的方式正确处理 run() 中的所有内容,则不会遇到问题。

【讨论】:

  • 重要的是要注意,这实际上并不能保证串行执行,而 OP 在使用队列时可能希望这样做。由于锁是在并发代码中获取的,所以有可能在写任务之前启动了读任务,但是写者先获取了锁。我不知道现有的 Executor 实现会允许锁获取串行发生。一个 hacky 解决方案可以使用一个自定义的后备队列,该队列在 poll() 中获取锁并在可运行结束时释放。
最近更新 更多