当前位置: 首页 > 知识库问答 >
问题:

在一个Servlet中同时处理

佟和平
2023-03-14

我有一个Servlet,它接收请求,必须处理5个任务(从外部服务器获取数据),并将所有数据发送回客户机。

共有3个答案

吕冠宇
2023-03-14

5秒太长了,它可能会占用web服务器资源,你可以让客户端发送一个请求a,这会触发你的5秒任务,但它不等待,立即返回。因为你知道这需要5秒钟,所以你可以在5秒钟后发送另一个请求B来获取数据。如果数据尚未准备好,您可以在另外5秒后请求,直到达到最大重试次数(由您自己定义)。

冷吉星
2023-03-14

另一个选项是ExecutorService。有各种可用的示例,包括以下内容:

  • 如何使用ExecutorService等待所有线程完成?
  • ExecutorService,如何等待所有任务完成

以下是从上面找到的第一个链接中获取的一些示例代码:

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
  taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
  taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  ...
}
尉迟阳煦
2023-03-14

您可以使用CoundDownLatch

一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

示例代码:

    CountDownLatch startSignal = new CountDownLatch(1);
    CountDownLatch doneSignal = new CountDownLatch(5); // 5 tasks

    class Worker implements Runnable {
        private final CountDownLatch startSignal;
        private final CountDownLatch doneSignal;
        private final int threadNumber;

        // you can pass additional arguments as well
        Worker(CountDownLatch startSignal, CountDownLatch doneSignal,
                                                   int threadNumber) {
            this.startSignal = startSignal;
            this.doneSignal = doneSignal;
            this.threadNumber = threadNumber;
        }

        public void run() {
            try {
                startSignal.await();
                doWork(); // actual work to be performed here    
                doneSignal.countDown();
            } catch (InterruptedException ex) {
                LOGGER.error(ex);
            }
        }
    }

    // 5 new threads are started
    for(int i=1;i<=5;i++){
        new Thread(new Worker(startSignal, doneSignal, i)).start();
    }

    startSignal.countDown(); // let all threads proceed
    try {
        doneSignal.await(); // wait for all to finish
        // all 5 tasks are finished and do whatever you want to do next
    } catch (InterruptedException interruptedException) {
        LOGGER.error(interruptedException);
    }

阅读更多...并查找更多示例...

 类似资料:
  • 我正在做我的一项任务。这相当直截了当。包含单个输入的HTML表单被提交到Servlet,Servlet获取参数,基于参数创建消息,将消息作为属性添加到请求,并使用requestdispatcher转发到jsp以显示消息。 我有一个要求,如果参数丢失,我需要显示一个错误页面。问题是我不能显式地检查null,也不能使用try/catch块。我的猜测是,目标是在web中定义错误页面。xml页面来处理特定

  • 我有个关于Recrusion的问题。recrusion背后的概念对我来说是清楚的,但是如果我想同时处理两个元素呢。有没有一个简单的方法来处理。 例如: 上面的线对我来说很清楚,但是如果我想要两个过程同时处理两个元素,就像这样: 相互独立地添加每个值。

  • 当我键入,例如,要从POST提交的表单中检索名称,我还必须编写一个类似于?如果我想支持这两种方法,我需要为所有POST和GET请求编写单独的语句吗? 我的问题与使用python和Flask获取请求变量的值密切相关。

  • 每个人 都。我一直在寻找这个问题,但我在这里没有找到它,所以我想它真的很简单。 我正在用JavaFX创建一个非常简单的应用程序,只需一个按钮。现在我想处理它的事件(如按下或释放),但当我在互联网上看到示例时,它们都使用匿名类(每个事件都有一个不同的类),这在我看来让代码变得肮脏。这就是为什么我想将事件处理程序放在一个单独的类中,并将它们添加到按钮中。 问题是我不知道我是否必须为每个事件创建一个不同

  • 编辑:这不是这个问题的重复,因为我正在尝试在同一个servlet的和之间发送数据。另一个问题询问如何在不同的servlet之间发送数据,但我已经通过将信息附加到URL来做到这一点(参见下面的第一个代码片段),这在同一个servlet中是做不到的。另外,链接的问题来自2011年,使用Tomcat 5.5,而我使用8.5。 我正在开发一个带有两个servlet和一个过滤器的小型Java 8/Tomca

  • 在一个web.xml中有多个jersey servlet是可能的吗?我尝试以这种方式执行RESTfull版本控制: