Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么多线程不能在AWS Lambda函数中完美工作?_Java_Multithreading_Amazon Web Services_Aws Lambda_Serverless - Fatal编程技术网

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");
}}