繁体   English   中英

如何每秒执行数以万计的异步操作,每个操作都有三秒的等待时间?

[英]How to execute tens of thousands of async operations per second that each have a three second wait time?

我需要在一个应用程序中每秒执行数以万计的 IO 绑定操作,每个操作都有 3 秒的延迟。 在 node.js 中,这可以简单地完成如下:

var events = require('events');
var eventEmitter = new events.EventEmitter();

var count = 0;

var connectHandler = function connected() {
    setTimeout(function() {
        count++;
        console.log('task complete ' + count);
    }, 3000);
}

for (var i = 0; i < 30000; i++) {
    eventEmitter.on('mockedIOTask', connectHandler);
}

eventEmitter.emit('mockedIOTask');

这如何在 Java 应用程序中完成? 我尝试了以下操作,但它一次只执行 3 个任务(出于显而易见的原因):

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ForkJoinPool;

public class Main {
    public static void main(String[] args) {
        //ExecutorService threadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 30000; i++) {
            final int count = i;
            ForkJoinPool.commonPool().submit(() -> {
                try {
                    Thread.sleep(3000);
                    System.out.println("task complete" + count);
                } catch (InterruptedException e) {
                }
            });
        }
        // Keep the program alive
        try {
            Thread.sleep(50000);
        } catch (InterruptedException e) {
        }
    }
} 

您可以在 3 秒后使用 ScheduledExecutorService 执行 30K 任务

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
List<Future<?>> tasks = new ArrayList<>();
for (int i = 0; i < 30000; i++) {
    final int count = i;
    tasks.add(ses.submit(() -> System.out.println("task complete" + count)));
}
for (Future f : tasks) f.get();
ses.shutdown();

如果你想添加 IO 绑定操作,我会从阻塞操作开始,然后迁移到使用像 netty 这样的库来处理非阻塞 IO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM