Почему многопоточность не работает в лямбда-функции AWS? - PullRequest
0 голосов
/ 21 декабря 2018
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();

    }}

Я пробовал нормально, и он работает нормально.но на лямбда-функции это не будет работать должным образом.Нить умирает до полного извинения нитей.когда вызывается оператор return, он автоматически останавливает потоки.

Expected result
Hello
Hello
Hello
Hello


Actual Result 

Hello 

1 Ответ

0 голосов
/ 21 декабря 2018

Как говорили люди в комментариях, проблема в том, что вы не дожидаетесь завершения потоков.Вы возвращаетесь с handleRequest(), как только закончите, начав темы.Это говорит Lambda о том, что ваше выполнение завершено, поэтому он приостанавливает ваш контейнер до того, как эти потоки получат возможность выполнить.

«Приостановляет ваш контейнер» - это разница между выполнением в Lambda и локальным.Когда вы запускаете локально, JVM фактически завершается, и он не будет этого делать, пока не завершатся все потоки, не являющиеся демонами.

Чтобы убедиться, что все потоки запущены, вам необходимо явно вызвать присоединение к ним перед возвратом из обработчика.function.

Чтобы помочь вам понять, как это работает, вам также следует добавить дополнительную отладочную информацию (используйте 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");
}}
...