当前位置: 首页 > 知识库问答 >
问题:

Android中的new Thread(task).start()VS threadpoolexecutor.submit(task)

蔺昊穹
2023-03-14

在我的Android项目中,我有很多地方需要异步运行一些代码(web请求、对db的调用等)。这是运行时间不长的任务(最多几秒钟)。到目前为止,我一直在做这种事情,创建一个新线程,并通过任务传递给它一个新的runnable。但是最近我读了一篇关于Java中的线程和并发性的文章,我明白了为每个任务创建一个新线程并不是一个好的决定。

因此,现在我已经在我的application类中创建了一个ThreadPoolExecutor,它包含5个线程。代码如下:

public class App extends Application {

    private ThreadPoolExecutor mPool;

    @Override
    public void onCreate() {
        super.onCreate();

        mPool =  (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
    }
}

我还有一个向执行器提交可运行任务的方法:

public void submitRunnableTask(Runnable task){
    if(!mPool.isShutdown() && mPool.getActiveCount() != mPool.getMaximumPoolSize()){
        mPool.submit(task);
    } else {
        new Thread(task).start();
    }
}

因此,当我想在代码中运行异步任务时,我获取app的实例,并调用submitRunnableTask方法,将runnable传递给它。正如您所看到的,我还检查,如果线程池有空闲线程来执行我的任务,如果没有,我创建一个新线程(我不认为这会发生,但无论如何……我不希望我的任务在队列中等待,从而降低应用程序的速度)。

在应用程序的onTerminate回调方法中,我关闭了池。

所以我的问题是:这种模式比在代码中创建新线程更好吗?我的新方法有什么利弊?它会导致我还没有意识到的问题吗?你能给我一些比这更好的方法来管理我的异步任务吗?

附言。我在Android和Java方面有一些经验,但我远不是一个并发专家),所以在这类问题上可能有一些方面我不太明白。任何建议都将不胜感激。

共有1个答案

阴飞星
2023-03-14

此答案假设您的任务很短

这种模式是否比在代码中创建新线程更好?

好一点了,但离理想还很远。您仍在为短任务创建线程。相反,您只需要创建一个不同类型的线程池-例如executors.newscheduledthreadpool(int corePoolSize)

行为上有什么不同?

  • FixedThreadPool将始终有一组线程要使用,如果所有线程都很忙,则新任务将放入队列。
  • executors类创建的(默认)scheduedthreadpool具有它所保留的最小线程池,即使在空闲时也是如此。如果一个新任务进来时所有线程都很忙,它就为它创建一个新线程,并在完成后60秒处理该线程,除非再次需要它。

第二个可以允许您不自己创建新线程。这种行为可以在没有“调度”部分的情况下实现,但是您必须自己构造执行器。构造函数是

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)

各种选项允许您微调行为。

如果有些任务很长...

    null
 类似资料:
  • 问题内容: 在我的Android项目中,我有很多地方需要异步运行一些代码(Web请求,对db的调用等)。这不是长时间运行的任务(最多几秒钟)。到目前为止,我一直在通过创建新线程,将任务传递给新的可运行线程来进行此类操作。但是最近我读了一篇有关Java中线程和并发的文章,并且了解到为每个任务创建一个新的Thread并不是一个好的决定。 所以现在我在我的课堂上创建了一个包含5个线程的。这是代码: 而且

  • 主要内容:RxJava Schedulers newThread 介绍,RxJava Schedulers newThread 示例RxJava Schedulers newThread 介绍 Schedulers.newThread() 方法创建并返回一个 Scheduler,它为每个工作单元创建一个新线程。 RxJava Schedulers newThread 示例 输出结果为:

  • 问题内容: 我一直在对此进行一些研究,但至少可以说我还是很困惑。 谁能给我一个何时使用以及何时使用的具体示例;?到底有什么区别?何时使用这些方法是否有黄金法则? 如果我错了,也可以纠正我,但是这两个“对象”不是在GUI主线程内(用于更新GUI)创建另一个线程的方法吗? 问题答案: 使用快速和简单的操作和复杂的和大的操作。 用例 用例中的任务示例 示例:为什么我们不能用于长计算(摘自以下参考资料)。

  • 提醒: 这个API不再是推荐的模式了 - export your tasks。因此就不翻译了! 在任务系统中定义任务。然后可以从命令行和 series()、parallel() 和 lastRun() api 访问该任务。 Usage Register a named function as a task: const { task } = require('gulp'); function b

  • task是监控系统一个必要的辅助模块。定时任务,实现了如下几个功能: index更新。包括图表索引的全量更新 和 垃圾索引清理。 falcon服务组件的自身状态数据采集。定时任务了采集了transfer、graph、task这三个服务的内部状态数据。 falcon自检控任务。 源码编译 # update common lib cd $GOPATH/src/github.com/open-falco