Java中有类似C#Task的东西吗?

时间:2012-08-18 11:12:53

标签: c# java concurrency

我正在努力学习C#!我最熟悉编程语言之间的Java!刚才我想了解Task! Java中有Task这样的东西吗?

Task和线程之间有什么区别? Task提供的线程无法做什么?基本上我们为什么需要Task

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

如果你查看文档,它说明任务是进行多线程编程的首选方式:

  

更有效,更可扩展地使用系统资源。

     

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

     

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

     

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

     

msdn

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

答案 3 :(得分:1)

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

e.g。 为每个请求启动新主题的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();
        }
    }
}

答案 4 :(得分:0)

  

任务和线程之间有什么区别? 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)

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

注意:下面的代码完成与上面的代码段相同的操作,但是更加优雅。在certain scenarios

中不建议使用.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)