java - Android 中的读写器任务队列

标签 java android concurrency task-queue

我正在制作一个带有 reading taskswriting tasks 的 android 应用。 我想获得以下行为:

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

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

对不起我的英语。谢谢

最佳答案

使用 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 block ,但实际上因为 run() 不应该抛出任何异常,所以如果您处理run() 中的一切都如您所愿。

关于java - Android 中的读写器任务队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39218936/

相关文章:

java - 为什么扩展接口(interface)不会使它的方法返回更精确的类型?

java - 地址值显示为空

java - 这个声明是什么意思?

android - - 类型 'GoogleServicesTask' 字段 'intermediateDir' 没有相应的 getter 已用 @OutputDirectory 注释

java - 哪里需要同步?

java - 在以下示例中声明同步方法的目的是什么

java - Maven 无法通过 `mvn exec:java` 调用编译 java 代码 (java.lang.ClassNotFoundException)

android - android服务的monodroid

python - 在 Python 中并发运行外部程序

java - 为什么这个数据库同步例程失败?