Java 为什么多线程不能在AWS Lambda函数中完美工作?
正如人们在评论中所说,问题在于您没有等待线程完成。一旦启动完线程,就可以从Java 为什么多线程不能在AWS Lambda函数中完美工作?,java,multithreading,amazon-web-services,aws-lambda,serverless,Java,Multithreading,Amazon Web Services,Aws Lambda,Serverless,正如人们在评论中所说,问题在于您没有等待线程完成。一旦启动完线程,就可以从handleRequest()返回。这会告诉Lambda您的执行已经完成,因此它会在这些线程有机会执行之前挂起您的容器 “挂起容器”是在Lambda上运行和在本地运行之间的区别。当您在本地运行时,JVM实际上会退出,并且在所有非守护进程线程完成之前不会退出 为了确保所有线程都运行,您需要在从处理程序函数返回之前显式地调用join 为了帮助您理解这是如何工作的,您还应该添加一些调试信息(使用System.err,因为它是无缓
handleRequest()
返回。这会告诉Lambda您的执行已经完成,因此它会在这些线程有机会执行之前挂起您的容器
“挂起容器”是在Lambda上运行和在本地运行之间的区别。当您在本地运行时,JVM实际上会退出,并且在所有非守护进程线程完成之前不会退出
为了确保所有线程都运行,您需要在从处理程序函数返回之前显式地调用join
为了帮助您理解这是如何工作的,您还应该添加一些调试信息(使用System.err
,因为它是无缓冲的):
看起来你没有加入@smac89的线程可能是重复的我怎么做?有一个
代码>丢失。除此之外,方法中的代码给出了预期的结果。从我在AWS lambdas上阅读的内容来看,在lambda函数中生成线程似乎没有什么帮助。您最好将工作分派到多个lambda函数或同步执行。而且似乎没有人在谈论连接线程,所以我认为这可能只是lambda函数的一个特性
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();
}}
Expected result
Hello
Hello
Hello
Hello
Actual Result
Hello
@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");
}}