java - 使用 Executor 处理 10000 个线程

标签 java multithreading threadpoolexecutor

我有一个 Web 服务,由 20 多个发送数据的服务器持续访问。我使用了 activeMQ,其中数据排队一段时间,而不是使用异步任务,该数据被取消排队。

我的异步任务线程类如下所示。

public class myConsumer {

    public void  asyncConsumer() throws InterruptedException, ExecutionException{
        final MyReceiver receiver = new MyReceiver(); 

        final ExecutorService executorService = Executors.newSingleThreadExecutor();
        try{
             Future future = executorService.submit(new Runnable() {
                 public void run() {
                     receiver.receiveMessage();          
                 }
           }); 

         executorService.shutdown();
         executorService.awaitTermination(5, TimeUnit.SECONDS);

        }catch (InterruptedException e) {
            logger.error("tasks interrupted");
        }finally {
            if (!executorService.isTerminated()) {
                logger.error("cancel non-finished tasks");
            }
            executorService.shutdownNow();
        }
    }
}

我有 10000 个线程正在运行。我的应用程序服务器由于异常行为而停止。如何使用上面的代码处理这么多线程。

最佳答案

您应该使用线程池执行器而不是单线程执行器,并确保它只是接收消息的线程池的一个实例。这样您就可以跟踪并限制并发线程的数量。

这是一个如何完成此操作的示例。通过将 executorservice 设为静态,您可以确保它只是一个实例,并且最多只能有 10 个并发线程。当您调用 asyncConsumer 来处理收到的消息时,会在线程池内创建并调用 MyReceiver(我假设它将处理该消息)。

public class MyConsumer {

    static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public void  asyncConsumer() {          
        Future future = executorService.submit(new Runnable() {
            public void run() {
               new MyReceiver().receiveMessage();          
            }
        });                  
    }
}

关于java - 使用 Executor 处理 10000 个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500121/

相关文章:

java - 在 ServerRequest 的 bodyToMono 上使用它时 subscribeOn 不起作用

java - 如何在没有jpa的情况下在spring boot上从oracle获取数据

C#在不按住按钮的情况下单击按钮运行耗时的方法

c++ - 如果我在 Linux 上有 Pthread 代码,在 std::thread 中实现相同的代码是否有优势?

java - 我们是否需要关闭 ExecutorService fixedThreadPool

java - 如何从 resultResult 中获取行数?

JavaFX 自定义 css 游标

java - 这段代码线程安全吗?静态方法修改httpservletrequest

java - 如何配置ThreadPoolExecutor来限制线程数

java - ThreadPoolExecutor 检查某个任务是否在队列中