我想从android中的主线程在后台运行多个耗时的函数, 每次用户点击按钮时,我都会通过运行以下代码来完成此操作。
Runnable runnable = new Runnable() {
@Override
public void run() {
someHeavyBackgroundProcessing(); // takes ~ 3sec
runOnUiThread(new Runnable() {
@Override
public void run() {
reflectProcessingChangesInUI();
}
});
}
};
new Thread(runnable).start();
问题是,当多个后台作业同时并行运行时,它们会相互干扰。
我想要一些方法来拥有一个后台线程,任务将排在那里,逐个执行,而不是并行执行。
所以总共会有2个主题。 UI的一个主要线程,以及所有繁重处理的另一个后台线程,其中每个后台作业逐个排队和处理。
干扰的一个例子 -
UI有2个按钮 - INSERT和SHOW
在单击INSERT时,每隔10k行将在sqlite db中逐个插入,每次都创建db的新实例并在每次插入后释放它。
所以当用户在插入作业进行时单击SHOW时,用户只会看到在该单击之前插入的行。
答案 0 :(得分:2)
您可以使用Executors.newSingleThreadExecutor()
。
https://developer.android.com/reference/java/util/concurrent/Executors.html#newSingleThreadExecutor%28java.util.concurrent.ThreadFactory%29
创建一个Executor,它使用一个工作线程来操作 无界队列
示例:
Runnable runnable = new Runnable() {
@Override
public void run() {
someHeavyBackgroundProcessing(); // takes ~ 3sec
runOnUiThread(new Runnable() {
@Override
public void run() {
reflectProcessingChangesInUI();
}
});
}
};
Thread thread = new Thread(runnable);
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; ++i) {
executor.execute(thread);
}