【发布时间】:2016-10-08 13:48:16
【问题描述】:
我需要在一个应用程序中每秒执行数万个 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 秒超时而不是 3 秒延迟。每个任务仅在 Node.js 中的单个线程中执行。目前尚不清楚这两个程序试图做什么。
-
应用程序正在模拟一个 IO 绑定任务,然后在 IO 绑定任务完成后执行一些操作(在这种情况下,打印到控制台)。我想知道如何在 java 应用程序中模仿 node.js 应用程序的行为。
标签: java node.js concurrency