본문 바로가기

jsp

자바 쓰레드(Thread) - 쓰레드로컬(ThreadLocal) 쓰레드 로컬이란걸 정말 몰랐었다. 지금도 잘 모르지만 일단 정의를 보자 ThreadLocal이란? 일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다. { int a = 10; ... // 블록 내에서 a 변수 사용 가능 } // 변수 a는 위 코드 블록이 끝나면 더 이상 유효하지 않다. (즉, 수명을 다한다.) 반면에 ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에, 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있게 된다. 아래 그림은 쓰레드 로컬 변수가 어떻게 동작하는 지를 간단하게 보여주고 있다.(출처 : 자바캔) 이라고 되어 있다. 아래 설명도 보자 ThreadLocal의 기본 사용법 .. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 동기화 (synchronized) 자판기 예제 자판기를 보자. 자판기안에는 음료수들이 차례차례로 들어 있다 그리고 공급자가 있고 사람들이 돈을 넣고 음료수를 빼먹는다. 공급자 - 음료수 공급자 소비자 - 돈을 넣고 음료수를 빼먹는 사람 만약 자판기에 음료수가 없으면 소비자가 돈을 넣고 음료수를 뽑을 수 있을까? 없다. 공급자가 음료수를 넣기 전까지는 소비자가 사용하면 안된다. 예제로 네개의 클래스를 만들어 보자 메인 클래스, 공급자 클래스, 자판기 클래스, 소비자 클래스를 아래와 같이 만들었다. 자판기에서는 자바 stack 을 사용하였다. 처음 넣은 음료수는 나중에 나온다고 설정해서 사용. getDrink()는 소비자가 뽑아 먹는 것을 구현한것인데.. while조건문에 스택이 비워져있으면 안에서 스레드 wait을 걸었다. 왜냐면 음료수도 없는데 뽑아.. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 동기화 (synchronized) 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 데이터 교환 예제 쓰레드간의 데이터를 교환할때 무작정 하면 안된다. 쓰레드는 어찌됐는 각각 따로따로 일을 처리 한다. 예를 들어 3.14 (파이값)를 구해서 찍는걸 생각해보자. 우선 클래스 4개를 준비해보자. - A : 메인메소드가 있는 클래스 - B : 파이값을 계산하는 클래스 - C : 파이값을 찍는 클래스 - D : B와 C를 위한 공통 공유 구역이다. 요지는 B에서 계산한 값을 D클래스 인스턴스 변수에다 넣고 C는 그걸 가져가다 찍는것이다. 결과를 테스트 해보면 C는 0.0을 찍는다. 왜냐하면 아직 B는 계산중이므로 D에 값을 던져주지 못했는데 C가 D의 값을 가져다 쓰니까 그런다. 이를 위해 B가 계산 끝나고 D에 값을 넣어 줄때까지 C는 B가 끝났는지 안끝났는지 체크하면서 값을 가져 올 필요가 있다. 아래 예제.. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 데이터 교환 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 join() 예제 아래 예제 목적은 메인에서 다른쓰레드 종료후 프로그램을 종료하기 위함이다. 소스 메인 메소드 보면 메인스레드 종료라는 메세지를 찍었는데 목적은 이 메세지가 가장 늦게 찍게 함이다. 이럴때 join()를 사용하면 메인에서 사용되었던 쓰레드들이 다 종료후 마지막으로 메인쓰레드가 종료된다. 메인쓰레드가 가장 늦게 종료한다는 관점에서 isAlive()와 비슷한 역할을 한다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 isAlive() 예제 보통 쓰레드로 프로그래밍을 할때 main쓰레드에서 자식 쓰레드를 생성후 자식 쓰레드들이 다 끝난 다음에 main쓰레드를 마쳐야 한다. 이럴때 main에서는 자식쓰레드들이 끝날때까지 기달려야 하는데 이럴때 isAlive()메소드를 사용하면 된다. 아래 예제는 메인에서 세개의 쓰레드 생성후 마칠때까지 메인에서 while문으로 점을 찍는데 이때 체크를 isAlive로 하였다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 yield() 예제 yield의미는 사전적으로 양보의 뜻을 가지고 있다. 아래 예제에서 쓰레드3개를 생성하고 돌린다. 이론상으로 첫번째 쓰레드가 다 끝나고 두번째~ 세번째가 실행 될 수도 있는데 보통 요즘 OS에서는 알아서 interrupt를 걸어서 서로서로 실행 하는걸 볼 수있다. 자바에서도 그런 역할을 하는것중 하나가 yield() 메소드이다. 더보기
자바 쓰레드(Thread) - 데몬쓰레드(Daemon Thread) 1. 데몬쓰레드가 아닌 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행 2. 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료 3. 예로서 가비지 컬렉터, 워드 프로세서의 자동 저장, 화면 자동 갱신등이 있다. 4. 쓰레드를 생성한 다음 실행전에 setDㅁemon(true)를 호출. 쓰레드 종류는 크게 두가지다 : 사용자 쓰레드, 데몬 쓰레드. 이전에 했던 예제는 전부 사용자 쓰레드였다. 사용자 쓰레드는 독립쓰레드고 데몬쓰레드는 종속 쓰레드이다. 예제를 보자 1. 첫번째 예제 티스토리나 포털 사이트 게시판을 보면 임시저장..알아서 자동저장하는 기능들이 있다. 아무튼 이와 비슷하게 쓰레드를 이용해서 구현할수 있다. 다만 여기서 보여주는건 데몬은 보조적인 역할이라고 했는데 그걸 확인해보고.. 더보기
자바 쓰레드(Thread) - 쓰레드그룹(ThreadGroup) 예제 1. 서로 관련된 스레드를 그룹으로 다루기 위한것 2. 스레드 그룹에 다른 스레드 그룹을 포함 시킬 수 있다. 3. 보안상의 이유로 도입된 개념 - 자신이 속한 스레드 그룹이나 하위 스레드 그룹은 변경 할 수 있지만, 다른 스레드 그룹의 스레드를 변경 할 수 없다. 4. 모든 스레드는 반드시 스레드 그룹에 포함되어 있어야 한다. - 스레드 그룹을 지정하는 생성자를 사용하지 않는 스레드는 기본적으로 자신을 생성한 스레드와 같은 그룹에 속하게 된다. 5. 자바 어플리케이션이 실행되면 JVM은 main과 system이라는 스레드 그룹을 만들고 JVM운영에 필요한 스레드들을 생성해서 이 스레드 그룹에 포함시킨다. - 우리가 생성하는 모든 스레드 그룹은 main 스레드의 하위 스레드 그룹이 되며, 스레드 그룹을 .. 더보기