我有一个 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/