按顺序执行新线程

时间:2018-03-08 20:48:29

标签: android multithreading executorservice

让我简化一下我的例子。想象一下,我有两个按钮。

btn_A.setOnClickListener(v -> {
                // update ROOM DB value to A
            });
btn_B.setOnClickListener(v -> {
                // update ROOM DB value to B
            });

按钮A将DB值设置为' A'。
按钮B将DB值设置为' B'。

由于我无法从Main / UI线程访问DB,因此我从新线程执行它:

btn_A.setOnClickListener(v -> {
    new Thread(() -> {
        // update ROOM DB value to A
    }).start();
});
btn_B.setOnClickListener(v -> {
    new Thread(() -> {
        // update ROOM DB value to B
    }).start();
});

如果我按下按钮A,B,A,B ......,那么我担心新线程不会连续执行(按顺序)。

我考虑过将ExecutorService与Executors.newFixedThreadPool(1)一起使用,但我不确定这是否会按顺序运行工作线程。此外,DB修改表示从不同的活动/服务调用,因此我应该使ExecutorService静态。我担心如果我将ExecutorService设置为静态并且不打电话给#shutdown;()',那么可能会导致内存泄漏。

我想避免使用队列逻辑实现我自己的生产者/消费者设计模式。

感觉有一种简单的方法可以做到,但我无法弄明白。 :(

1 个答案:

答案 0 :(得分:0)

您需要在单个线程上运行所有更新。一种方法是使用LooperHandler以便将消息发送到数据库更新线程,并按接收的顺序执行这些消息。在更高级别,您可以使用像Otto这样的事件总线库来帮助促进这种线程间通信。