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

标签 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 数据库中,每次创建新的数据库实例并在每次插入后释放它。

因此,当用户在插入作业正在进行时单击“显示”时,用户将只能看到在单击之前已插入的行。

最佳答案

您可以使用Executors.newSingleThreadExecutor()https://developer.android.com/reference/java/util/concurrent/Executors.html#newSingleThreadExecutor%28java.util.concurrent.ThreadFactory%29

Creates an Executor that uses a single worker thread operating off an unbounded queue

示例:

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

关于java - Android - 如何在一个后台线程中对多个作业进行排队?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42469652/

相关文章:

像自动更正这样的代码需要 Java 帮助

android - 如何动态定义R.drawable的名称

android - 以编程方式将 fragment 添加到 View 组

java - 是否有旨在调试并发软件的 JVM?

c# - 生产者-消费者示例,都在 lock(this) block 中

multithreading - 使用Delphi TThread

java - 在 Java Web 应用程序中实现协作身份验证

java - 访问子类中的父类(super class)静态方法

java - Spring 中的日志消息银行

Android 从 java 类回调到 Activity