问题标签 [futuretask]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
403 浏览

android - Android:用于并行处理数据的Future/FutureTask

我正在尝试为我的 Android 应用程序优化复杂的数据更新器和解析器。服务器提供三种接口功能。解析器需要来自所有这三个函数的数据。

当数据下载完成后,解析器就可以启动了。它由许多可以并行化的不同独立任务组成。

我正在考虑使用 Futures 或 FutureTasks 来处理数据。

所以基本上,这是程序:

  1. 创建Task-1、Task-2、Task-3用于下载数据
  2. 等待下载完成
  3. 创建 Task-1,..., Task-N 用于解析数据
  4. 等待解析器完成
  5. 调用回调以表明该过程已完成。

我的第一个问题:是否可以使用异步函数创建 Futures,使用回调返回数据(网络框架)?

第二个问题:在这种情况下分别使用 Futures 或 FutureTasks 是否有任何缺点,或者有没有更好的解决方案来实现这一点?

谢谢你。

0 投票
2 回答
5117 浏览

java - 在java中运行带有超时的异步代码

在我编写的 Web 服务器中,每个请求都会调用一个操作列表。其中一些操作不像其他操作那么重要,所以我想在后台线程中运行它们。

此外,由于它们并不那么重要,我不在乎它们中的一个是否很少失败,并且我不希望它们永远占用一个线程,因此其他线程将可用于处理下一批。

所以,我想要一个线程池(例如:10个线程)并像这样为每个后台任务分配一个线程。将每个线程限制为 1 秒,如果到此时间还没有完成,则将其杀死,以便下一个任务进入。

我该怎么做呢?

到目前为止,这就是我所拥有的:

我想像这样使用这个类:

这会像我想要的那样工作吗?或者我应该如何改变它呢?
如果我打电话Run()但线程池中没有可用的线程可以分发怎么办?

0 投票
0 回答
289 浏览

java - 这是使用 Java FutureTask 和 Callable 的正确方法吗?

我正在实现一个层来包装第 3 方通信层。

我需要执行的合同是:

我的层有一个 onMessageReceived 方法,当响应到达时由第 3 方调用。

我为实现我的层而采取的方法如下:

我有一个可调用的,它等待一个超时条件:

我还扩展了 FutureTask 以公开 set 方法,如下所示:

任务完成后,我向可调用对象发出信号以停止它。

所以每次调用 send 时,我都会创建一个新的 MyFutureTask,使用 executor 运行它,将它保存在 map 中并返回它。

当 onMessageReceived 被调用时,我在地图中找到任务并使用 set 方法设置其结果。

这是一个好方法吗?

还有一个问题:在任务中移动执行器逻辑是否是一种好方法?我的意思是,为它创建一个启动方法,它将使用执行器运行任务。

请指教。

0 投票
2 回答
1407 浏览

java - 使用 FutureTask 进行并发

我有这样的服务:

现在我想要它更快,我发现有些过滤器可以同时启动,而有些过滤器必须等待其他过滤器完成。例如:

意思是:

1.filter1和filter2可以同时启动,filter3和filter4也可以同时启动

2.filter3和filter4必须等待filter2完成

还有一件事

如果 filter2 返回 true,则 'process' 方法立即返回并忽略以下过滤器。

现在我的解决方案是使用 FutureTask:

我的可调用过滤器:

我想知道:

1.在案例中使用FutureTask是个好主意吗?有更好的解决方案吗?

2.线程上下文切换的开销。

谢谢!

0 投票
1 回答
1622 浏览

java - 如何实现带回调的异步调用?

我需要创建一个库,其中包含同步和异步方法。

我的图书馆的核心逻辑 -

客户将使用我们的库,他们将通过传递DataKey构建器对象来调用它。然后,我们将使用该对象构造一个 URL,并通过执行该 URL 对该 URL 进行 HTTP 客户端调用,在我们将响应作为 JSON 字符串返回后,我们将通过创建对象DataKey将该 JSON 字符串原样发送回我们的客户DataResponse.

我将有同步和异步方法。一些客户会调用该executeSynchronous方法来获得相同的功能,而一些客户会调用我们executeAsynchronous的方法,并且使用该executeAsynchronous方法,他们将调用future.get那里的代码本身。

下面是我的界面 -

下面是我的DataResponse课-

下面是我的DataStatusEnum课-

下面是我的DataErrorEnum课-

然后我有我DataClient的实现上述Client接口。

现在下面是我的简单类,它将执行实际任务 -

问题陈述:-

正如我上面提到的,一些客户会调用executeSynchronous方法来获取他们在对象中传递的那个用户 ID 的数据,DataKey而一些客户会用对象调用executeAsynchronous方法,DataKey但在后一种情况下,他们会future.get在他们的代码库中做。

如果你看到我的executeSynchronous方法,我future.get在调用executeAsynchronous方法之后做,如果有的话TimeoutException,那么我正在使用PotoLogging我们公司特定的类进行日志记录,这些日志将转到这里的其他一些服务,我们用它来查看我们所有的错误日志仪表板。它主要取决于我们如何用什么名称记录它,以便我们可以在仪表板中看到这些名称。

现在的问题是我们公司内的客户也可以调用executeAsynchronous方法,但这意味着,他们将future.get在他们的代码库中执行,这也可能导致TimeoutException他们的代码,但我不能强迫他们以与我相同的方式登录。所以我的问题是——如果有人在他们的代码库中TimeoutException调用我的库的方法,我有什么办法可以得到回调,如果有的话,我可以这样记录它——executeAsynchronous

我需要这样做,以便我的图书馆可以TimeoutException按照我们想要的方式登录我们公司拥有的工具。否则,我需要告诉每个客户像这样记录它,以便我们可以在仪表板中看到它。如何从异步调用中获取回调并仍然利用异步的所有功能?

做这个的最好方式是什么?

0 投票
0 回答
702 浏览

java - 尝试取消 ThreadPoolExecutor Android 中的任务时,cancel() 不起作用

我有一些下载作为任务提交给ThreadPoolExecutor. 现在,我ThreadPoolExecutor在一个扩展的全局类中创建它Application。我将所有提交的任务存储在带有 id 的哈希图中。

我在片段中有一个列表视图。此列表视图项包含暂停和恢复按钮。当我单击列表项本身时,下载FutureTask将提交给全局池执行器。现在,当我单击列表视图项的暂停按钮时,我希望该特定任务暂停。

onClick在列表视图的自定义适配器中有暂停按钮的方法。因此,当我在我的适配器类中单击按钮时,我会按名称获取与该列表项相关的未来任务,然后执行.cancel(). 当我检查isCancelled()值时,它返回true. 这意味着任务已被取消,但我的下载仍在运行并且文件已完全下载。我该如何解决这个问题?任何帮助,将不胜感激。

PS:我也尝试过将可运行的线程作为参数传递给执行程序。然后,我会按其名称获取线程(使用ThreadFactory返回带有名称的线程的自定义),然后调用thread.wait()直到再次按下恢复按钮。也不行!

这是示例代码:

我的 GlobalState 类:

我的片段类中编写的下载方法。在列表项单击时执行:

我的自定义列表适配器代码在 onclick 的暂停按钮内:

实际上,我更喜欢使用 wait() 或类似的方法暂停和恢复我的任务,而不是完全取消任务。任何帮助,将不胜感激。谢谢!

0 投票
1 回答
244 浏览

java - 如何终止在多线程中超时的任务?

我需要创建一个库,其中包含同步和异步方法。

  • executeSynchronous()- 等到我有结果,返回结果。
  • executeAsynchronous()- 立即返回一个 Future,如果需要,可以在其他事情完成后处理它。

我的图书馆的核心逻辑

客户将使用我们的库,他们将通过传递DataKey构建器对象来调用它。然后,我们将使用该对象构造一个 URL,并通过执行该 URL 对该 URL 进行 HTTP 客户端调用,在我们将响应作为 JSON 字符串返回后,我们将通过创建对象DataKey将该 JSON 字符串原样发送回我们的客户DataResponse. 有些客户会打电话executeSynchronous(),有些客户可能会打电话executeAsynchronous(),这就是为什么我需要在我的库中分别提供两种方法。

界面:

然后我有我DataClient的实现上述Client接口:

将执行实际任务的简单类:

问题陈述:-

当我开始研究这个解决方案时,我并没有终止已经超时的任务。我正在向客户端报告超时,但任务继续在线程池中运行(可能会长时间占用我有限的 10 个线程之一)。cancel所以我在网上做了一些研究,我发现我可以通过使用on取消那些超时的任务future,如下所示 -

但我想确定一下,我在executeSynchronous取消已超时任务的方法中所做的方式是否正确?

由于我正在调用which 如果任务仍在队列cancel()Future,它将停止运行,所以我不确定我在做什么是正确的还是不正确的?这样做的正确方法是什么?

如果有更好的方法,那么任何人都可以提供一个例子吗?

0 投票
1 回答
27 浏览

multithreading - 如何使用 FutureTasks 提高性能

问题看起来很简单,我有很多(大量)操作需要处理,但是,只有当所有这些操作都返回结果时,主线程才能继续。我只尝试了一个线程,每个操作最多需要 2 到 10 秒,最后大约需要 2.5 分钟。尝试了未来的任务并将它们全部提交给 ExecutorService。所有这些都是一次处理,但是每个都需要大约 40 到 150 秒。在一天结束时,整个过程大约需要 2.1 分钟。

如果我是对的,所有线程不过是一次执行的一种方式,尽管共享处理器的能力,而我认为我会得到处理器大量工作以让我同时执行所有任务同时他们在一个线程中执行。

问题是:有没有办法我可以做到这一点?(也许不是未来的任务,也许是别的东西,我不知道)

细节:我不需要它们同时工作这对我来说实际上并不重要真正重要的是性能

0 投票
1 回答
621 浏览

java - 使用 future.cancel() 终止底层线程以重用线程

有了这个,我的输出是

但是程序会在很久以后终止。为什么一旦线程中断就会发生?

如果我删除f.cancel(true),我的线程会继续运行并打印以下内容:

我能做些什么来终止程序,即终止内线程?实际上,我想将此线程用于线程池中的其他任务,这似乎不会在这里发生。

在返回之前放置Thread.currentThread().isInterrupted()所有地方看起来不是一个好主意。

0 投票
2 回答
8332 浏览

java - 如何转换java Future到番石榴 ListenableFuture

我需要找到一种从 Future 转换为 ListenableFuture 的方法。目前我正在使用一个返回 Future 的服务,但我需要连接一个监听器。我无法更改服务接口,因为它不属于我。

有没有一种简单的方法可以做到这一点?

我已经阅读了番石榴文档,但我仍然找不到办法。