5

我正在努力学习 C#!编程语言之间我最熟悉Java!刚才我正在努力理解Task's!TaskJava中有类似的东西吗?

Task's 和 thread有什么区别?Task线程不能提供什么?基本上为什么我们需要Task's?

4

5 回答 5

9

我会说最接近的 1:1 课程是Future<T>or CompletableFuture<T>CompletableFuture有一些额外的链接方法,类似于Task<T>C# 中的方法。

显然在任务并行库(C#)的早期版本中Task<T>被称为Future<T>http://www.nedstoyanov.com/promises-and-futures/

于 2017-01-01T23:49:39.190 回答
5

Java 7 中引入的 Fork/Join 框架可能是最接近的:

http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

于 2012-08-18T11:28:23.800 回答
2

任务是你想做的事情,线程是执行你的任务的事情

例如 ,为每个请求启动一个新线程的 Web 服务器

 class ThreadPerTaskWebServer {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(80);
        while (true) {
            final Socket connection = socket.accept();
            Runnable task = new Runnable() {
                public void run() {
                    handleRequest(connection);
                }
            };
            new Thread(task).start();
        }
    }
}
于 2012-08-18T11:25:47.913 回答
1

如果您查看文档,它指出任务是进行多线程编程的首选方式:

更高效、更可扩展地使用系统资源。

在幕后,任务排队到线程池,该线程池已通过算法(如爬山)进行了增强,该算法可确定并调整线程数以最大限度地提高吞吐量。这使得任务相对轻量级,您可以创建许多任务以启用细粒度并行性。为了补充这一点,采用了广为人知的工作窃取算法来提供负载平衡。

比线程或工作项更多的编程控制。

任务和围绕它们构建的框架提供了一组丰富的 API,支持等待、取消、继续、强大的异常处理、详细状态、自定义调度等。

微软

所以任务实际上是线程,但界面更简单。你也可以看看这个问题,它基本上问的问题和你一样: SO Question

于 2012-08-18T11:22:49.447 回答
1

任务和线程有什么区别?Task 提供了哪些线程不能做的事情?基本上,为什么我们需要任务?

线程是一种并行机制,而任务是一种同步机制。简单来说,一个线程就是一个工作者,一个任务就是一个工作单元。通常,同一个工作人员可以不并行地执行多个工作单元。它可以通过优先处理任务和管理完全由 .NET 在幕后完成的上下文来实现高效率。

这样想吧。作为开发人员,您到达工作岗位时,您有两张票要完成。一张票需要项目经理的澄清。因此,您向项目经理发送电子邮件询问更多信息。

真的不需要等待回复,您可以开始处理第二张票。您仍然是单个线程(单个工作人员),但您正在管理两个任务 - 两个工作单元。当您处理第二张工单时,产品经理会给出答案。您可以选择切换上下文并返回执行工单 1,或者您可以等到工单 2 完成后才将上下文切换回工单 1。

在另一种情况下,您可以选择一个队友并分配她的工单 2。在这种情况下,您正在实现真正的并行化,但您需要两个工作人员参与:您自己和您的同事。

在 .NET 生成中,新线程的计算成本非常高。每当长时间运行的操作受 I/O 限制(例如从 DB 读取)时,使用任务是一种很好的做法。最好将线程用于 CPU 绑定的繁重操作,例如繁重的数学计算。

var productsTask = GetItemtsAsync(odredId) // dispatch call to DB
var userTask = GetUserInfoAsync(userId) // dispatch another call to DB

// wait until both calls are completed, their order is irrelevant
// and it is fully managed by the runtime
Task.AwaitAll(productsTask, userTask)

// now we have enough data to generate an invoice 
// (this is all done on one thread)
var invoice = GenerateInvoice(productsTask.Result, userTask.Result)

通过在单独的线程中运行 DB 调用,您将使您的代码变慢,因为您仍然无法控制 DB 调用运行多长时间,此外,您将花费时间创建新线程(这些将是非常昂贵的操作,内存方面和 CPU 周期)

注意:下面的代码完成了与上面的代码片段相同的事情,但它更优雅。在某些情况下.Result不建议使用

var productsTask = GetItemtsAsync(odredId) // dispatch call to DB
var userTask = GetUserInfoAsync(userId) // dispatch another call to DB

var invoice = GenerateInvoice(await productsTask, await userTask)
于 2019-12-13T20:12:07.633 回答