Список пропущенных тем безопасен - PullRequest
0 голосов
/ 18 октября 2019

Я передаю объекты 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";
    }

}
...