Я передаю объекты List (в классе StudentBL.java ниже) исполнителю задач Spring.
Безопасен ли поток в методе call ()? Заметьте, что мне нужно только пройти этот список в методе call (), но не изменять его содержимое.
applicationContext.xml имеет следующие конфигурации.
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="500" />
</bean>
// См. StudentBL.java
public class StudentBL {
static ApplicationContext appContext = null;
public StudentBL() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ThreadPoolTaskExecutor taskExecutor=(ThreadPoolTaskExecutor)appContext.getBean("taskExecutor");
try {
List<Student> students = new ArrayList<>();
students.add(new Student("1", "A"));
students.add(new Student("2", "B"));
if(!CollectionUtils.isEmpty(students)){
List<Future<String>> futureList = new ArrayList<>();
for (int i=0;i<10;i++) {
MyTask objMyTask=(MyTask)appContext.getBean(MyTask.class, students);
Future<String> result = taskExecutor.submit(objMyTask);
futureList.add(result);
}
for(Future<String> future : futureList) {
try {
System.out.println("Future Response: "+future.get());
} catch (InterruptedException | ExecutionException | TaskRejectedException e) {
e.printStackTrace();
StringWriter stack = new StringWriter();
e.printStackTrace(new PrintWriter(stack));
}
}
}
} catch (Exception e) {
e.printStackTrace();
StringWriter stack = new StringWriter();
e.printStackTrace(new PrintWriter(stack));
}
}
}
// См. MyTask.java
import java.util.List;
import java.util.concurrent.Callable;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope(value = "prototype")
public class MyTask implements Callable<String> {
List<Student> students;
public MyTask(List<Student> students) {
this.students=students;
}
@Override
public String call() throws Exception {
for(Student student:students){
System.out.println("Student Object From List Having ID: "+student.getId());
}
return "success";
}
}