【问题标题】:TPL Equivalent for Java/Android适用于 Java/Android 的 TPL 等效项
【发布时间】:2011-09-26 01:35:40
【问题描述】:

我很想知道是否有类似于 Java 和/或 Android SDK 中的 C# 中的任务并行库的东西。来自 C# 背景,我们被告知创建新线程是一项相对重量级的操作,并被指示使用线程池,或者最近的任务。

所以在我看来,Tasks 带来的抽象级别是理想的……有没有类似的东西,甚至是线程池?还是只涉及制作一个新的Thread 或制作my own threadpool

【问题讨论】:

  • 关于“重量级操作”的说法,见stackoverflow.com/questions/2117072/…
  • 看到这个问题已经有 3 年历史了 - 有人知道今天的最新技术吗?我们还在使用 Executors 和 Java 5 Concurrency 的东西吗?或者有没有新的实现,比如 Java 8 或 RxJava 中的东西可以更好地解决这个问题?

标签: java multithreading task-parallel-library


【解决方案1】:

确实如此。你可以在这里阅读更多信息:Executors

此外,您可以在同一页面上概述整个并发主题:Concurrency

【讨论】:

  • 除非我遗漏了什么,否则这不提供继续支持。并不是说你不能在此基础上实现它,但我怀疑它很难做到正确,而且在语法上也会很讨厌。
  • @KentBoogaart 是的,Java 没有提供任何类似于延续任务的功能,您必须自己编写代码。就个人而言,我认为延续任务很糟糕,但如果你喜欢它,你可以看看 Lightwolf 框架:lightwolf.sourceforge.net/index.html
  • 阅读更多。似乎我可以使用 fork/join 的东西来实现本质上类似的东西,但不确定它有多优雅/可维护。
  • 如果代码仍然可维护,我只会对实现异步工作流感兴趣。 .NET 中的 TPL 允许这样做(尤其是在带有 async/await 的 C# 5 中,或者在 F# 中更自然),但它似乎在 Java 中会很混乱,并且在我的情况下可能不值得负担。跨度>
  • @KentBoogaart 嗯,我想你也可以看看 JBPM。它是一个开源流程建模引擎,可让您完全按照自己的需要去做。唯一的问题是,它可能会变成用显微镜来砸钉子的问题——JBPM 专为管理业务流程而设计,包含许多您永远不需要的功能。它也有相当长的学习曲线。本质上,您在某个进程中定义了一组任务,为每个“任务”附加一些 Java 代码,将计算结果推/拉到您的上下文中,然后全部运行以查看结果。
【解决方案2】:

【讨论】:

    【解决方案3】:

    我认为java.util.concurrent 包具有您正在寻找的大部分类/功能。

    具体来说,看看这些:

    1. ThreadPoolExecutor
    2. Executors
    3. CompletionService

    【讨论】:

      【解决方案4】:

      根据 Java 开发人员的说法,Java 并发编程应该朝着使用新的并发 API 的方向发展。

      检查:http://download.oracle.com/javase/1.5.0/docs/guide/concurrency/index.html

      【讨论】:

        【解决方案5】:

        Android 支持 Java 并发库,但您应该查看 AsyncTask,它支持在 UI 线程和后台运行操作。

        这是一个任务的简短示例:

        private class CharCountTask extends AsyncTask<String, Integer, Long> {
          protected Long doInBackground(String... in) {
            long result = 0;
            for(int i=0,n=in.length; i<n; i++) {
              result += in[i].length();
              publishProgress((int) (i / (double) count) * 100);
            }
            return result;
          }
        
          protected void onProgressUpdate(Integer... progress) {
            // update progress here
            updateProgressBar(progress[0]);
          }
        
          protected void onPostExecute(Long result) {
            // update the UI here
            setTotalChars(result);
          }
        }
        

        使用它:

        new CharCountTask().execute("first", "second", "third");
        

        【讨论】:

          【解决方案6】:

          查看https://github.com/dtag-dbu/task4java/ 上的 Task4Java 框架。

          此框架基于标准 Java 库构建,也可在 Android 上运行。目前我们正在创建一个示例应用程序来展示这个框架的强大功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-23
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            • 2010-10-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多