Android - 如何在一个后台线程中排队多个作业?

时间:2017-02-26 14:20:50

标签: java android multithreading

我想从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时,用户只会看到在该单击之前插入的行。

1 个答案:

答案 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);
        }