我正在努力学习C#!我最熟悉编程语言之间的Java!刚才我想了解Task
! Java中有Task
这样的东西吗?
Task
和线程之间有什么区别? Task
提供的线程无法做什么?基本上我们为什么需要Task
?
答案 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,支持等待,取消,延续,强大的异常处理,详细状态,自定义调度等。
所以任务实际上是线程,但界面更简单。你也可以看看这个基本上和你一样的问题: 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)