gpt4 book ai didi

java - 为什么多线程在 AWS Lambda 函数中不能完美运行?

转载 作者:行者123 更新时间:2023-11-29 08:25:03 28 4
gpt4 key购买 nike

public class LambdaFunctionHandler implements RequestHandler<Object, String> {

@Override
public String handleRequest(Object input, Context context) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
}
Thread thread1 = new Thread(runnable);
thread1.start();
Thread thread2 = new Thread(runnable);
thread2.start();
Thread thread3 = new Thread(runnable);
thread3.start();
Thread thread4 = new Thread(runnable);
thread4.start();

}}

我已经正常尝试过了,效果很好。但在 lambda 函数上它将无法正常工作。 线程在线程完全执行之前就死了。当调用 return 语句时,它会自动停止线程。

Expected result
Hello
Hello
Hello
Hello


Actual Result

Hello

最佳答案

正如人们在评论中所说,问题在于您没有等待线程完成。一旦完成启动线程,您就从 handleRequest() 返回。这会告诉 Lambda 您的执行已完成,因此它会在这些线程有机会执行之前暂停您的容器。

“暂停您的容器”是在 Lambda 上运行和在本地运行之间的区别。当您在本地运行时,JVM 实际上会退出,并且直到所有非守护线程都完成后才会退出。

为确保所有线程都运行,您需要在从处理程序函数返回之前显式调用 join 它们。

为了帮助您理解这是如何工作的,您还应该添加更多调试信息(使用 System.err 因为它是无缓冲的):

@Override
public String handleRequest(Object input, Context context) {

Runnable runnable = new Runnable() {
@Override
public void run() {
System.err.println("Hello from " + Thread.currentThread().getName());
}
};

Thread thread1 = new Thread(runnable);
thread1.start();
Thread thread2 = new Thread(runnable);
thread2.start();
Thread thread3 = new Thread(runnable);
thread3.start();
Thread thread4 = new Thread(runnable);
thread4.start();

thread1.join();
thread2.join();
thread3.join();
thread4.join();

System.err.println("handler function exiting");
}}

关于java - 为什么多线程在 AWS Lambda 函数中不能完美运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53884794/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com