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
答案 0 :(得分:3)
正如人们在评论中所说,问题在于您没有等待线程完成。完成线程启动后,您将从mvn clean install -T 1.5C
返回。这告诉Lambda您的执行已完成,因此它将在这些线程有机会执行之前挂起容器。
“挂起容器”是在Lambda上运行和在本地上运行之间的区别。在本地运行时,JVM实际上会退出,直到所有非守护程序线程都完成后,JVM才会退出。
为确保所有线程都运行,您需要在从处理函数返回之前,显式调用它们。
为帮助您了解其工作原理,还应该添加更多调试信息(使用 this.getObsInitializedHandlerThread()
.map(mMyHandlerThread ->{
mMyHandlerThread.start();
return mMyHandlerThread;
});
是因为它没有缓冲):
handleRequest()