在 lambda 表达式中创建的对象未存储
Object created in lambda expression not stored
使用下面的代码片段,
String[][] users = {user1, user2, user3, user4, user5};
Queue<Form> formList = new ArrayBlockingQueue<>(5);
Executor executor = Executors.newCachedThreadPool();
executor.execute(() -> {
System.out.println(Thread.currentThread().getName());
for(String[] user: users) {
Form f = new Form(user[0], user[1], user[2], user[3], user[4]);
formList.add(f);
}
});
System.out.println(formList);
我想将在 lambda 中创建的所有表单存储在 formList(队列)中。但它最后给了我空队列。任何建议
您要求执行器在另一个线程上执行任务。这可能需要时间来启动必要的线程并执行工作,与此同时,您的主线程已经打印了 formList
的当前内容(即什么都没有)。
为了能够打印任务的结果,您需要等到任务完成,例如关闭 ExecutorService
并等待终止,或者改用 ExecutorService.submit
Executor.execute
,并收集返回的期货并在所有这些期货上使用 get
以等待它们完成。还有很多其他选项,比如使用 CompletionService
或 CompletableFuture
等
使用下面的代码片段,
String[][] users = {user1, user2, user3, user4, user5};
Queue<Form> formList = new ArrayBlockingQueue<>(5);
Executor executor = Executors.newCachedThreadPool();
executor.execute(() -> {
System.out.println(Thread.currentThread().getName());
for(String[] user: users) {
Form f = new Form(user[0], user[1], user[2], user[3], user[4]);
formList.add(f);
}
});
System.out.println(formList);
我想将在 lambda 中创建的所有表单存储在 formList(队列)中。但它最后给了我空队列。任何建议
您要求执行器在另一个线程上执行任务。这可能需要时间来启动必要的线程并执行工作,与此同时,您的主线程已经打印了 formList
的当前内容(即什么都没有)。
为了能够打印任务的结果,您需要等到任务完成,例如关闭 ExecutorService
并等待终止,或者改用 ExecutorService.submit
Executor.execute
,并收集返回的期货并在所有这些期货上使用 get
以等待它们完成。还有很多其他选项,比如使用 CompletionService
或 CompletableFuture
等