Tag: 异步

如何以异步方式发出Web请求

我需要从Java向RESTful服务器发出Web请求。 我想让我的Java代码异步处理响应。 我正在寻找一个处理请求的线程和回调的框架。 顺便说一下,我看了一下FutureTask,它似乎不是我需要的,因为它要求客户端在某个时候等待它完成。 我正在寻找完成后的回调。

IllegalStateException:AsyncContext.startAsync(req,res)不支持

我创建了一个servlet 3.0来探索异步请求处理: @WebServlet(name=”MyTest”, urlPatterns={“/MyTest”}, asyncSupported=true) public class MyTest extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { AsyncContext tmp = req.startAsync(req, res); … } } 但是当.startAsync(…)时,我得到一个IllegalStateException 。 我知道Javadoc提到了exception,但我明确地启用了异步(cf WebServlet注释)。 我正在使用随NetBeans提供的Tomcat 7.0.11.0。 我可以确认req.isAsyncSupported()返回false。 我究竟做错了什么? 我还需要做什么来启用异步处理? 编辑: 我试图实现以下示例并得到相同的问题。

如何实现真正的异步java线程

我有一个需要执行两个操作的函数,一个快速完成,另一个需要很长时间才能运行。 我希望能够将长时间运行的操作委托给一个线程,我不关心线程何时完成,但线程需要完成。 我实现了如下所示,但是,我的第二次操作永远不会完成,因为函数在start()调用之后退出。 我如何确保函数返回但第二个操作线程也完成其执行并且不依赖于父线程? public void someFunction(String data) { smallOperation() SecondOperation a = new SecondOperation(); Thread th = new Thread(a); th.Start(); } class SecondOperation implements Runnable { public void run(){ // doSomething long running } }

从另一个异步方法调用的Spring异步方法

我正在使用Spring 4并且我注意到一个奇怪的行为……如果我从普通实例方法多次调用异步方法,那么它们都会在不同的线程中调用并随机完成。 但是,如果我从另一个异步方法多次调用异步方法,那么它们按顺序完成。 我有这样的事情: @Async public void nonAsyncMethod() { for (int i = 0; i < 30; i++) { asyncMethod(); } } @Async public void asyncMethod() { … something here } 我正在使用默认的异步执行程序。 我应该使用另一个吗? 但是,这个执行程序不会重用任何线程并且每次都启动另一个线程所以它应该没问题……这可能只是一个巧合吗? 但是我尝试了10次以上,如果我恢复到第一种方法的非异步,那么它们会随机完成

在许多客户端连接的情况下,Netty线程模型如何工作?

我打算在即将开展的项目中使用Netty。 该项目将充当客户端和服务器。 特别是它将建立和维护与各种服务器的许多连接,同时为其自己的客户提供服务。 现在, NioServerSocketChannelFactory的文档公平地指定了服务器端的线程模型 – 每个绑定的侦听端口在整个过程中都需要专用的boss线程,而连接的客户端将在工作线程上以非阻塞的方式处理。 具体来说,一个工作线程将能够处理多个连接的客户端。 但是, NioClientSocketChannelFactory的文档不太具体。 这似乎也利用了boss和worker线程。 但是,文档说明: 一个NioClientSocketChannelFactory有一个boss线程。 它根据请求进行连接尝试。 一旦连接尝试成功,boss线程就将连接的Channel传递给NioClientSocketChannelFactory管理的其中一个工作线程。 工作线程似乎也以与服务器案例相同的方式运行。 我的问题是,这是否意味着从我的程序到外部服务器的每个连接都会有一个专用的boss线程? 如果我建立数百个或数千个此类连接,这将如何扩展? 作为旁注。 重新使用单个Executor(缓存线程池)作为ChannelFactory的bossExecutor和workerExecutor是否有任何不良副作用? 那么在不同的客户端和/或服务器ChannelFactory实例之间重新使用呢? 这里有一些讨论 ,但我没有找到足够具体的答案。 任何人都可以详细说明这个吗?

为什么CompletableFuture.supplyAsync成功随机次数?

我是Java 8中lambdas和异步代码的新手。我不断得到一些奇怪的结果…… 我有以下代码: import java.util.concurrent.CompletableFuture; public class Program { public static void main(String[] args) { for (int i = 0; i < 100; i++) { String test = "Test_" + i; final int a = i; CompletableFuture cf = CompletableFuture.supplyAsync(() -> doPost(test)); cf.thenRun(() -> System.out.println(a)) ; } } private static boolean doPost(String t) { System.out.println(t); […]

JavaFx:在应用程序执行不同方法时,与消息异步更新UI标签

我正在尝试使用应用程序的各种状态消息异步更新JavaFx GUI中的标签。 例如 我的Application中的按钮“更新”调用控制器中的方法updateSettings()。 现在我尝试以下列方式更新UI上的标签。 @FXML private void updateSettings() { label.text(“message1”); //some action lable.text(“action done”); label.text(“calling method.. wait for some time”) // call to time consuming method – timeConsumingMethod(); label.text label.text(“operation completely successfully”); } private void timeConsumingMethod() { label.text(“message2”); //some actions label.text(“message3”); //more time consuming actions label.text(“time consuming method is done with success”); } 我希望在流程执行时这些消息应该显示在标签中,以向用户显示应用程序中正在进行的各种活动。 […]

使用Runnable在Java中实现回调

我习惯用类似JavaScript或类似Erlang的语言编写代码,在那里我可以轻松地创建回调函数。 现在我必须用Java写一些东西。 我想出了如何执行这样的回调: import java.util.*; class Demo extends Thread{ private int data; public void run(){ ask_for_data(new Runnable(){ public void run(){ on_data(); } }); } public void on_data(){ System.out.println(“Async callback: ” + data); } public void ask_for_data(final Runnable callback){ System.out.println(“2”); Runnable r = new Runnable(){ public void run(){ data = get_data(); new Thread(callback).start(); } }; new […]

如何避免请求设置ASYNC_SUPPORTED = true以在Tomcat 7上启用异步servlet 3.0处理?

在报告此问题后 ,找到了一个解决方案: req.setAttribute(“org.apache.catalina.ASYNC_SUPPORTED”, true); 这看起来有点奇怪,并不是真正的“便携式”代码(它不会受到伤害,但……)。 它似乎特定于Tomcat 7.我使用的是NetBeans 7.0.1提供的Tomcat 7.0.14。 我找不到文档,表明有必要在servlet 3.0中使用catalina属性启用异步请求处理。 我找不到文档,表明在Tomcat配置级别也需要特殊的东西。 有没有办法避免在每个请求中设置ASYNC_SUPPORTED=true以在Tomcat 7中启用异步servlet 3.0处理?

同步版本的异步方法

在Java中创建异步方法的同步版本的最佳方法是什么? 假设你有一个使用这两种方法的类: asyncDoSomething(); // Starts an asynchronous task onFinishDoSomething(); // Called when the task is finished 如何实现在任务完成之前不返回的同步doSomething() ?