为什么多线程在AWS Lambda函数中无法正常工作?

时间:2018-12-21 12:26:04

标签: java multithreading amazon-web-services aws-lambda serverless

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 

1 个答案:

答案 0 :(得分:3)

正如人们在评论中所说,问题在于您没有等待线程完成。完成线程启动后,您将从mvn clean install -T 1.5C返回。这告诉Lambda您的执行已完成,因此它将在这些线程有机会执行之前挂起容器。

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

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

为帮助您了解其工作原理,还应该添加更多调试信息(使用 this.getObsInitializedHandlerThread() .map(mMyHandlerThread ->{ mMyHandlerThread.start(); return mMyHandlerThread; }); 是因为它没有缓冲):

handleRequest()