Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中是否有类似C#Task的东西?_C#_Java_Concurrency - Fatal编程技术网

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

Java中是否有类似C#Task的东西?,c#,java,concurrency,C#,Java,Concurrency,我正在努力学习C!我最熟悉Java之间的编程语言!刚才我正在试着理解任务!Java中是否有类似于Task的东西 任务和线程之间有什么区别?Task提供了哪些线程无法提供的功能?基本上,我们为什么需要任务 如果您查看文档,就会发现任务是执行多线程编程的首选方式: 更高效、更可扩展地使用系统资源 在幕后,任务排队到线程池,线程池通过确定并调整线程数量以最大化吞吐量的算法(如爬山)进行了增强。这使得任务相对轻量级,您可以创建许多任务以实现细粒度并行。为了补充这一点,采用了广为人知的工作窃取算法来提供负

我正在努力学习C!我最熟悉Java之间的编程语言!刚才我正在试着理解任务!Java中是否有类似于
Task
的东西


任务
和线程之间有什么区别?
Task
提供了哪些线程无法提供的功能?基本上,我们为什么需要
任务

如果您查看文档,就会发现任务是执行多线程编程的首选方式:

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

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

比线程或工作项可能实现的编程控制更多

任务及其周围构建的框架提供了一组丰富的API,支持等待、取消、继续、健壮的异常处理、详细状态、自定义调度等

因此,任务实际上是线程,但具有更简单的接口。你也可以看看这个问题,它的问题基本上与你的问题相同:

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

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();
        }
    }
}

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


我认为最接近的1:1等级是or
CompletableFuture
有一些额外的链接方法,类似于C#中的
Task
中的链接方法

显然,在任务并行库(C#)的早期版本中,
Task
被称为
Future
()

任务和线程之间有什么区别?任务提供了哪些线程无法完成的功能?基本上,我们为什么需要任务

线程是一种并行机制,任务是一种同步机制。简单地说,线程是工作者,任务是工作单元。通常,同一个工作人员可以不并行地执行多个工作单元。它可以通过对任务进行优先级排序和管理上下文(完全由.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


我想这给了你一些想法。可能是重复的是的,我读了一些文档!但是钢铁我不知道什么时候我应该想,嗯,在这里我可以使用任务而不是线程!C#中的任务与android平台使用的任务相同吗?您是否在考虑AsyncTask?android平台使用Java,所以不,它们不一样。对于第二个问题,@Amit Deshpande给出的答案应该足够了。有可能有那么多线程执行同一个任务吗?是否可以将任务分成若干部分,每个线程负责完成任务的一部分?从JCIP>复制的理想情况下,任务是独立的活动:不依赖于其他任务的状态、结果或副作用的工作。独立性促进了并发,因为如果有足够的处理资源,独立任务可以并行执行。为了提高调度和负载平衡任务的灵活性,每个任务还应代表应用程序处理能力的一小部分。
var productsTask = GetItemtsAsync(odredId) // dispatch call to DB
var userTask = GetUserInfoAsync(userId) // dispatch another call to DB

var invoice = GenerateInvoice(await productsTask, await userTask)