问题标签 [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 投票
3 回答
3857 浏览

java - 将上下文(CDI/servlet)注入新的 FutureTask 线程

我发现在 servlet 中创建的新线程不包含 servlet/CDI 上下文。我创建了一个 HelloWorld servlet(如下所示)来试验这个问题。在下面的示例中,您将看到我在一个新线程 (FutureTask) 中运行“doIt()”函数。但它返回 NULL 但是当我直接调用 'doIt()' 方法时,BeanManager 不是 NULL。

我在网上搜索但找不到一个很好的参考,而不是说这是可能的。如果有人可以帮助我或为我提供一些好的指针来将上下文注入/传递到新线程中,那就太好了。

0 投票
2 回答
1211 浏览

java - 如果任何一台服务器出现故障,为什么我会看到很多 TimeoutException?

这是我的 DataClientFactory 类。

这是我的 DataClient 类。

我从上面的工厂获取我的客户端实例,如下所示,然后getDataSync通过传递DataKey对象来调用方法。DataKey 对象中包含userIdTimeout值。现在,在此之后,一旦被调用,就会调用我的DataTask类来调用方法。callhandle.get

这是我的 DataTask 类,它具有所有逻辑 -

现在基于userId,我将获取serialId然后获取主机名列表,我想根据传递的标志进行调用。然后我迭代hostnames列表并调用服务器。假设我在链表中​​有四个主机名(A、B、C、D),那么我将首先调用 A,如果我取回数据,则返回 DataResponse。但是假设如果 A 已关闭,那么我需要立即将 A 添加到阻止列表,以便没有其他线程可以调用 A 主机名。然后调用主机名 B 并取回数据并返回响应(如果 B 也关闭,则重复相同的操作)。

我还有一个后台线程,它每 10 分钟运行一次,它会在我们从工厂获取客户端实例后立即启动,它会解析我的另一个服务 URL 以获取我们不应该调用的块主机名列表。由于它每 10 分钟运行一次,因此任何关闭的服务器,它只会在 10 分钟后获取列表,通常假设如果 A 关闭,那么我的服务将提供 A 作为主机名的阻止列表,并且一旦 A 启动,那么该列表也会在 10 分钟后更新。

这是我的后台线程代码DataScheduler-

这是我的 ClientData 类,它包含主机名阻止列表和 partitionMappings 详细信息(用于获取有效主机名列表)的所有信息。

问题陈述:-

当所有服务器都启动时(以 A、B、C、D 为例),上面的代码工作正常,我看不到任何TimeoutException事情发生,handle.get但是如果假设一台服务器(A)出现故障,我应该这样做从主线程进行调用,然后我开始看到很多TimeoutException,我的意思是,发生了大量的客户端超时。

我不确定为什么会这样?一般来说,这不会发生,因为一旦服务器关闭,它就会被添加到 blockList 中,然后没有线程会调用该服务器,而是会尝试列表中的另一个服务器?所以这应该是一个顺利的过程,然后一旦这些服务器启动,blockList 将从后台线程更新,然后您就可以开始拨打电话了。

我上面的代码有什么问题会导致这个问题吗?任何建议都会有很大帮助。

一般来说,我想做的是 - 根据使用映射对象传递的用户 ID 创建主机名列表。然后调用第一个主机名并获取响应。但是,如果该主机名已关闭,则添加到阻止列表并调用列表中的第二个主机名。

这是我看到的 Stacktrace -

注意:对于多个 userId,我们可以拥有相同的服务器,这意味着服务器 A 可以解析到多个 userId。

0 投票
2 回答
298 浏览

java - 实现 TimeoutTask 的最佳方法

我正在尝试实现一个TimeoutTask将在给定超时后终止的。这是我所拥有的:

它正在工作,如果没有给出输入,我可以看到超时消息。但是,该过程不会终止。以下是 Eclipse 控制台的屏幕截图,请参见突出显示的部分:

在此处输入图像描述

当我提供任何输入时,该过程立即终止。我FutureTask#cancel从 catch 块也从 finally 块调用我要求通过调用来关闭服务,ExecutorService#shoutDownNow我可以看到它正在打印 finally 被调用。

  • 如果超时,如何停止正在执行的进程?
  • 有没有更好的方法来实现这一目标?

我正在使用Java 8

参考:

更新

Marko Topolnik的回答中说原因是 Java IO 不中断;所以我将其更改Callable为:

对于这种情况,同样的事情发生了。

注意:这Callable只是一个示例。

0 投票
3 回答
4100 浏览

java - Java取消未来 - 如何等待完成?

长话短说:我有一组Future物品。其中一些已经在进行中,而另一些则没有。我迭代集合并调用future.cancel(false),根据文档,它应该取消所有Future当前未运行但应该允许所有其他人完成的 s。

我的问题是:我怎么知道Future在我打电话后什么时候完成future.cancel(false)future.isDone()总是返回true,因为cancel()在此之前确实被调用并且future.get()总是抛出 aCancellationException即使Future仍在运行。

有什么建议么?

0 投票
1 回答
1385 浏览

java - 使用 Futuretask 的带有输入流阅读器的 Java 异步进程运行器

我正在尝试运行异步进程并获取其输入流(如果有)。

这是我的代码:

这是进程运行任务

我无法获得流程输出,请注意两件非常重要的事情:

  • 进程必须是异步的,因为我需要管理超时
  • Process 的 InputStream 可以是可选的,并且不能锁定等待内容的线程:可以有一个没有任何输出的进程。

更新

我正在尝试这个版本......似乎工作,但我不知道它是否足够强大。

0 投票
1 回答
129 浏览

java - 有没有办法在java中使用Callable等待状态?

我有一个问题:我创建了一个实现 Callable 的任务。该任务有一个等待状态返回为假的任务。状态取决于服务器返回。我不知道服务器何时返回 false。所以我创建了一个名为 WaitForStatus 的任务,如下所示。如果状态为真,此任务将调用 Thread.sleep(); 只要状态为假,此任务就会完成。我能怎么做?

下面是我的代码:

你能帮我更正这段代码吗?

0 投票
2 回答
93 浏览

java - ArrayAdapter 刷新数据

我正在构建一个应用程序,该应用程序根据与服务器通信的 Futuretask 线程动态填充/取消填充数组列表。

问题是,当我将新对象添加到我的数组适配器中时,我以任何方式调用notifyDataSetChangedsetNotifyOnChange

(例如添加项目后,我还尝试制作一些调用notifyDataSetChanged的postadd函数,甚至尝试在适配器构造函数中添加setNotifyOnChange,或者在添加之前添加(adapter.setNotifyOnChange(true)))

在这个 Futuretask 中,它只是冻结线程并导致应用程序故障。当我用手指滑动调用 ArrayAdapter 的 getView() 时,如果没有 notifyonchange,它可以工作,但这是不受欢迎的行为。

注意:我通过静态变量引用访问适配器。

注意#2:我不认为一遍又一遍地创建新适配器是一个明智的选择。

/编辑:

我的删除方法如下所示:

(它最后挂在最后一个pharantesis)

0 投票
1 回答
1167 浏览

android - Calling a RESTful Web Service using FutureTask

For the time being I am using AsyncHttpClient to call RESTfull WebService from android Device and it is running fine. I want to optimize it using FutureTask as it allows us to check if a thread is finished and stuff. The code I am using now is something like this

What I know is to make AsyncHttpClient inside call function of Callable < class >, to call WebService.

Here I am confused as AsyncHttpClient is also running in a thread. How should I call Web Service using Future.

NOTE: - Beginner in Threading.

0 投票
1 回答
657 浏览

java - Java Executor在前一个完成后执行一个Callable?

我有一个自定义业务需求。我需要执行一系列服务调用。这些调用中的每一个都会在数据库中创建一条新记录。我需要在上一个服务调用完成后执行下一个服务调用,因为新的服务调用将使用上一个服务调用在数据库中创建的记录作为输入参数。

我决定将这些服务调用中的每一个包装在 Future Tasks 中,然后用于Executors.newSingleThreadExecutor()循环执行这些任务。

请建议它是否足够,如果它不会有更好的解决方案?

我还需要task.isDone()在执行下一个任务之前放置吗?

0 投票
2 回答
55993 浏览

multithreading - CompletableFuture、supplyAsync() 和 thenApply()

需要确认一些东西。以下代码:

将与以下内容相同:

对?

此外,另外两个问题是“我们有什么理由要使用thenApply吗?”

1)有大代码进行转换?

或者

2) 需要在其他地方重用 lambda 块?