按顺序执行新线程
Executing new threads in order
让我简化我的例子。假设我有两个按钮。
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线程访问数据库,所以我从新线程执行它:
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();
});
如果我按下Button A, B, A, B...,那么我担心新的线程不会连续(按顺序)执行。
我考虑过将 ExecutorService 与 Executors.newFixedThreadPool(1) 一起使用,但我不确定这是否会 运行 工作线程按顺序。此外,数据库修改命令是从不同的 Activities/Service 调用的,因此我应该将 ExecutorService 设为静态。我担心如果我将 ExecutorService 设为静态而不调用 'shutdown()',那么可能会导致内存泄漏。
我想避免使用队列逻辑实现我自己的 producer/consumer 设计模式。
感觉好像有一个简单的方法可以做到,但我想不通。 :(
您需要 运行 在单个线程上进行所有更新。一种方法是使用 Looper
和 Handler
将消息发送到数据库更新线程,并按接收到的顺序执行这些消息。在更高层次上,您可以使用像 Otto 这样的事件总线库来帮助促进这种 inter-thread 通信。
让我简化我的例子。假设我有两个按钮。
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线程访问数据库,所以我从新线程执行它:
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();
});
如果我按下Button A, B, A, B...,那么我担心新的线程不会连续(按顺序)执行。
我考虑过将 ExecutorService 与 Executors.newFixedThreadPool(1) 一起使用,但我不确定这是否会 运行 工作线程按顺序。此外,数据库修改命令是从不同的 Activities/Service 调用的,因此我应该将 ExecutorService 设为静态。我担心如果我将 ExecutorService 设为静态而不调用 'shutdown()',那么可能会导致内存泄漏。
我想避免使用队列逻辑实现我自己的 producer/consumer 设计模式。
感觉好像有一个简单的方法可以做到,但我想不通。 :(
您需要 运行 在单个线程上进行所有更新。一种方法是使用 Looper
和 Handler
将消息发送到数据库更新线程,并按接收到的顺序执行这些消息。在更高层次上,您可以使用像 Otto 这样的事件总线库来帮助促进这种 inter-thread 通信。