Java/Java 개념

학습 // Java // Stream // Parallel

문스코딩 2018. 10. 1. 17:37
업데이트 :: 2018.10.01



Stream Parallel

/**
 *  # [동시성과 병렬성]
 *      동시성 :: 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질
 *      병렬성 :: 멀티 작업을 위해 멀티 코어를 이용해서 동시에 실행하는 성질
 *          데이터 병렬성 :: 전체 데이터를 쪼개서 병렬 처리 ( 스트림 )
 *          작업 병렬성 :: 서로 다른 작업을 병렬로 처리 ( 웹서버 )
 *
 * # [포크조인 프레임워크]
 *      - 병렬 스트림을 이용하면 런타임시에 포크조인 프레임워크 동작
 *      - 포크단계 :: 전체 데이터를 서브 데이터로 분리후 병렬처리
 *      - 조인단게 :: 서브 데이터의 결과를 조합해서 최종결과 도출
 *
 * */
public class Doc_Parallel {

    public static void main(String[] args) {
        parallelStream();
        compare();
    }

    /**
     * 병렬로 스트림을 이용해서 커스텀리스트 만들기
     *
     * @date 2018.10.01
     * @author SDM
     * @version 1.0
     * */
    public static void parallelStream() {
        List<Student> totalList = Arrays.asList(
                new Student("nameA", 10, Student.Zender.MALE, Student.City.Seoul),
                new Student("nameB", 20, Student.Zender.FEMALE, Student.City.Seoul),
                new Student("nameC", 30, Student.Zender.MALE, Student.City.Pusan),
                new Student("nameD", 40, Student.Zender.FEMALE, Student.City.Pusan),
                new Student("nameE", 50, Student.Zender.MALE, Student.City.Pusan)
        );

        MaleStudent maleStudent = totalList.parallelStream()
                .filter(s -> s.getZender() == Student.Zender.MALE)
                .collect(MaleStudent::new, MaleStudent::accumulate, MaleStudent::combine);

        maleStudent.getList().stream()
                .forEach(s -> System.out.println(s.getName()));
        System.out.println();
    }

    /**
     * 순차처리 vs 병렬처리
     *
     * @date 2018.10.01
     * @author SDM
     * @version 1.0
     * */
    public static void compare() {
        List<Integer> list = Arrays.asList(0,1,2,3,4,5,6,7,8,9);

        // 순차
        long timeSequencial = sequencial(list);

        // 병렬
        long timeParallel = parallel(list);

        System.out.println("[순차] " + timeSequencial);
        System.out.println("[병렬] " + timeParallel);
        System.out.println();
    }

    /**
     * 작업메소드 (작업이 없을때 :: 순차 < 병렬)
     *
     * @date 2018.10.01
     * @author SDM
     * @version 1.0
     * */
    public static void work(int value) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 순차처리
     *
     * @date 2018.10.01
     * @author SDM
     * @version 1.0
     * */
    public static long sequencial(List<Integer> list) {
        long start = System.nanoTime();
        list.stream().forEach(a->work(a));
        long end = System.nanoTime();
        long runTime = end - start;
        return runTime;
    }

    /**
     * 병렬처리
     *
     * @date 2018.10.01
     * @author SDM
     * @version 1.0
     * */
    public static long parallel(List<Integer> list) {
        long start = System.nanoTime();
        list.stream().parallel().forEach(a->work(a));
        long end = System.nanoTime();
        long runTime = end - start;
        return runTime;
    }

    static class Student implements Comparable<Student> {

        public enum Zender { MALE, FEMALE };
        public enum City { Seoul, Pusan };

        String name;
        int age;
        Zender zender;
        City city;


        public Student(String name, int age, Zender zender, City city) {
            this.name = name;
            this.age = age;
            this.zender = zender;
            this.city = city;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public Zender getZender() {
            return zender;
        }

        public void setZender(Zender zender) {
            this.zender = zender;
        }

        public City getCity() {
            return city;
        }

        public void setCity(City city) {
            this.city = city;
        }

        @Override
        public int compareTo(Student o) {
            return Integer.compare(age, o.getAge());
        }
    }

    static class MaleStudent {
        private List<Student> list; // 요소를 저장할 컬렉션

        public MaleStudent() {
            list = new ArrayList<Student>();
            System.out.println("[" + Thread.currentThread().getName() + "] MaleStudent()");
        }

        /**
         * 요소를 수집하는 메소드
         *
         * */
        public void accumulate(Student student) {
            list.add(student);
            System.out.println("[" + Thread.currentThread().getName() + "] accumulate()");
        }

        /**
         * 두 MaleStudent를 결합하는 메소드 ( 병렬처리시에만 호출 )
         *
         * */
        public void combine(MaleStudent other) {
            list.addAll(other.getList());
            System.out.println("[" + Thread.currentThread().getName() + "] combine()");
        }

        public List<Student> getList() {
            return list;
        }

        public void setList(List<Student> list) {
            this.list = list;
        }
    }
}

Created by MoonsCoding

e-mail :: jm921106@gmail.com

반응형

'Java > Java 개념' 카테고리의 다른 글

학습 // Java // IO // Console  (0) 2018.10.16
학습 // Java // IO  (0) 2018.10.16
학습 // Java // Stream // Group  (0) 2018.10.01
학습 // Java // Stream // Collect  (0) 2018.10.01
학습 // Java // Stream // API  (0) 2018.09.27