쓰레드

쓰레드

    규칙 70 - 스레드 안전성에 대해문서로 남겨라.

    클래스를 사용할 때 클래스의 객체와 정적 메서드가 병렬적으로 이용되었을 때, 어떠한 부작용이 있을 수 있는지 안전한지에 대한 정보가 없으면 추후에 큰 문제를 야기할 수있다. JavaDoc에서 synchronized 키워드를 통해 병렬설 지원 여부를 확인할 수있다고 알고 있으나 실상 그렇지 않다. 왜냐하면 Javadoc이 만드는 문서에는 Javadoc이 들어가지 않는다. 왜냐하면 synchronized 키워드는 메서드의 구현 상세에 해당하는 정보이며, 공개 API의 일부가 아니기 때문이다. 그렇기 때문에 synchronized 키워드를 통해 판단해서는 안되고 병렬적으로 사용해도 되는지의 여부는 문서에 남겨져 있어야 한다. 출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사..

    규칙 68 - 스레드보다는 실행자와 태스크를 이용하라.

    여러 쓰레드를 실행해야할 때, 큐에 넣고 작업을 진행하거나 할 수 있으면 더욱 효율적으로 관리 할 수있다. 그래서 자바 1.5부터 자바 플랫폼에는 java.util.concurrent가 추가되었다. 이 패키지에는 Executor Framework가 들어 있는데 이는 인터페이스 기반 task 실행 프레임워크이다. 해당 Executor를 실행하기 위해서는 다음과 같이 입력하면 된다.1234567ExecutorService executor = Executors.newSingleThreadExecutor(); executor. @Override public void run() { System.out.println("test"); }});Colored by Color Scriptercs 그리고 만약 executo..

    규칙 67 - 과도한 동기화는 피하라

    동기화 시에 너무 많은 동기화 블록을 사용할 경우에 데드락이 걸리거나 성능저하 등등 문제를 일으킬 수 있는 소지들이 몇 가지 있다. 특히 동기화 영역안에서 수행되는 작업의 양을 가능한 줄여야 한다. 자바에서는 동기화에 대한 비용처리가 그나마 잘되어있지만 잘 사용해야 하는 이유는 잘못된 동기화 사용은 각 쓰레드들의 메인 메모리 접근에 대한 지연시간을 늘릴 수 있기 때문에 비용이 증가할 수 있다. 또한 클래스 내에서 동기화를 수행하는 것이 외부에서 객체 호출 시 사용하는것 보다 높은 병행성을 달성 할 수 있을 때문 진행해야한다. 다시말하자면 필요할 때 해당 메서드등을 호출하여 동기화를 실행해야지 해당 메서드 자체를 동기화 하는것은 좋지 않다. 예를 들면 기존에는 StringBuffer를 사용하여 내부적으로 ..

    Java Thread 대표 메서드 소개 및 특징 정리

    처음 입사 후 담당했던 프로젝트의 경우 단일 스레드로 동작하며, 동작 필요에 따라 Thread를 만들어주고 UI에 Lock 걸리는 것을 방지하기 위해 UI Thread 처리도 별도로 해주어야 했다. 그래서 Thread에 대해 많이 익숙 했었다. 하지만 Web 프로젝트를 진행하면서 Container에서 기본적으로 Multi-Thread를 지원해주기 때문에 동기화 처리를 제외하고는 그렇게 크게 Multi-Thread에 대해 처리를 해줄 필요가 없게 되었다. 핑계일 수 있지만 이러한 이유로 많이 잊어먹은 Thread에 대해 다시한번 정리해보았다. Thread 실행 Thread에서 start를 해야한다. start()메소드는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(공간)을 생성한 다음 run()을 호..

    Thread 폴링 방식

    폴링 방식계속 돌면서 쓰레드가 종료될 때까지 while문으로 대기하다가 출력되면 종료콜링 방식쓰레드 안에서 종료되면 호출 하는 방식호출할 클래스의 레퍼런스를 알기위해서 대게 생성자로 해당 클래스에 대한 정보를 넘긴다.콜백이 폴링보다 좋은 이유는 CPU 시간을 낭비하지 않는다.콜백에 대표적인 예는 UI 컴포넌트에 이벤트를 달고 리스너를 지정해 주는 것이다. 그러면 해당 객체는 본인을 호출할경우 해당 메소드를 호출하는 콜백을 진행한다. 이는 옵저버 패턴이라고 한다. 스레드의 run() 메소드의 실행이 거의 끝나갈때, 마지막으로 해야 할 작업은 결과값과 함께 메인 프로그램에서 미리 정해 놓은 메소드를 호출하는 것이다. 메인 프로그램이 각각의 스레드에 대해서 결과를 물어 보는 것이 아니라, 각각의 스레드가 메인..