ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Concurrent 프로그래밍 소개
    JAVA/JAVA8 관련 2022. 5. 20. 16:48

    Concurrent 소프트웨어

    동시에 여러 작업을 할 수 있는 소프트웨어

    • 예) 웹 브라우저로 유튜브를 보면서 키보드로 문서에 타이핑을 할 수 있음.
    • 예) 녹화를 하면서 인텔리J로 코딩을 하고 워드에 적어둔 문서를 보거나 수정할 수 있음.

     

    자바에서 지원하는 컨커런트 프로그래밍

    • 멀티프로세싱 (ProcessBuilder)
    • 멀티쓰레드

     

    자바 멀티쓰레드 프로그래밍

    • Thread / Runnable

     

    - 실행 순서가 보장되지 않음.

    public class Thread1 {
    
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.start();
    
            System.out.println("main Thread : " + Thread.currentThread().getName());
            // java8 style 
            /*Thread java8Style = new Thread(() -> {
                System.out.println("람다식 new Thread : " + Thread.currentThread().getName());
            });
            java8Style.start();
            */
        }
        // java 8 이전 스타일
        static class MyThread extends Thread{
            @Override
            public void run() {
                System.out.println("new Thread : " + Thread.currentThread().getName());
            }
        }
    }

    순서상 new Thread main Thread보다 먼저 출력돼어야 할 것 같지만 쓰레드의 자원 할당은 OS에 의해 결정되므로 순서가 보장되지 않음.

     

    Thread를 상속받는 방식

    static class MyThread extends Thread{
    	@Override
    	public void run() {
    		System.out.println("new Thread : " + Thread.currentThread().getName());
    	}
    }

    Runnable을 구현하는 방식

    Thread thread = new Thread(new Runnable() {
    	@Override
    	public void run() {
    		System.out.println("new Thread : " + Thread.currentThread().getName());
    	}
    });

    Sleep, 현재 Thread 대기시키는 기능

    public class Thread2 {
    
        public static void main(String[] args) {
            Thread thread = new Thread(()-> {
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException  e) {
                    e.printStackTrace();
                }
                System.out.println("new Thread(람다식) :" + Thread.currentThread().getName());
            });
            thread.start();
            System.out.println("main Thread : " + Thread.currentThread().getName());
        }
        // 매우 높은 확률로 main Thread 로그가 먼저 찍힘
    }

    Interrupt, 다른 쓰레드 깨우기

    쓰레드가 Sleep하는 동안 쓰레드를 깨우면 Interrupted Exception이 발생한다.

    Interrupt 메서드를 통하여 깨우는 것이 가능하다.

     

    public class Thread3 {
    
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(() -> {
                while(true) {
                    System.out.println("반복중... : " + Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        System.out.println("interrupt!!!!");
                        return;
                    }
                }
            });
            thread.start();
            System.out.println("main Thread : " + Thread.currentThread().getName());
            Thread.sleep(3000);
            thread.interrupt();
        }
    
    }

     

    Join, 이전 쓰레드가 끝날때까지 기다리기

    다른 쓰레드가 끝날 때까지 기다리려면 Join을 사용하면된다.

    public class Thread4 {
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(() -> {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new IllegalStateException(e);
                }
            });
            thread.start();
            System.out.println("waiting for " + thread.getName());
            thread.join();
            System.out.println("finished : " + thread.getName());
        }
    }

     

     

     

     

    'JAVA > JAVA8 관련' 카테고리의 다른 글

    Callable과 Future  (0) 2022.05.28
    Concurrent - Executor  (0) 2022.05.22
    Date와 Time  (0) 2022.05.15
    Date 와 Time 소개  (0) 2022.05.15
    Optional API 사용  (0) 2022.04.17
Designed by Tistory.