본문 바로가기

자바스레드

자바 쓰레드(Thread) - Atomic 예제 동기화를 배울때 synchronized와 volatile을 공부했다. synchronized는 메소드 시그니쳐나 블럭(?)을 지정할때 volatile은 변수에 대한 동기화였다. 아래 예제를 보자. 예제는 백만까지 for루프를 돌면서 합계를 구하는 것이다. 위의 예제를 돌려보면 결과값이 499999500000 나온다(백만의 합계이다) 걸린 시간은 대략 컴퓨터에 따라 다르지만 내 컴퓨터 기준으로는 32ms 다.(내 컴이 꾸리다) 그럼 쓰레드를 두개 생성후 돌리면 어떻게 될까? 499999500000 * 2 = 999999000000 가 나와야 하지 않을까? 근데 아니다. 가끔씩 값이 다르게 나온다.(아래처럼) 이유는 아무리 변수에 대한 volatile처리를 했어도 add메소드에서 동시에 두개가 작업이 들어가.. 더보기
자바 쓰레드(Thread) - Volatile 예제 요즘은 64비트 컴퓨터가 많이 보급됐지만 불과 몇년해도 32비트였다. 물론 지금도 엄청 많다. Volatile이라는것은 변수에 동기화(?)를 거는 것이라고 한다. 자바에서 int는 32비트 연산을 수행하지만 long이나 double은 64비트 연산을 한다. 그래서 int는 원자연산이라고 한다(더이상 쪼갤수 없는..) 이와 달리 long은 아니다. 쓰레드에서 long형으로 연산을 하다 보면 값이 엉뚱하게 나올 수 있다. 아래예제가 그 예이다. long형 두개를가지고 비교하는 것이다. 무한 반복을 해서 첫번째 long을 꺼내서 while문에서 똑같은 0번째 를 꺼내와서 비교하는것이다. (말이 좀 이상한가 아무튼 같은 값을 비교 하는것이다.) 메인에서 쓰레드 한개를 생성해서 돌리면 오류없이 잘 돌아간다. 왜냐.. 더보기
자바 쓰레드(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)의 join() 예제 아래 예제 목적은 메인에서 다른쓰레드 종료후 프로그램을 종료하기 위함이다. 소스 메인 메소드 보면 메인스레드 종료라는 메세지를 찍었는데 목적은 이 메세지가 가장 늦게 찍게 함이다. 이럴때 join()를 사용하면 메인에서 사용되었던 쓰레드들이 다 종료후 마지막으로 메인쓰레드가 종료된다. 메인쓰레드가 가장 늦게 종료한다는 관점에서 isAlive()와 비슷한 역할을 한다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 Life Cycle 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 우선순위(Priority)예제 코딩을 하면서 직접 우선순위를 셋팅할 일은 거의 없다고 한다. 뭐 정말 한다면 말리진 안겠지만.. 그래도 어떻게 돌아 가는지 예제를 살펴보자. 더보기
자바 쓰레드(Thread) - Thread와 객체의 구분에 대한 예제 제목 그대로 스레드는 객체에 속한것이 아니다..(말이 조금 그런가..) 일단 이전 글에서의 그림을 다시 보자. 아래 예제에서 두개의 클래스를 만들었다. 총 3개의 스레드가 생성이 된다. main(), tno1, tno2에 의한 스레드. tno1, tno2 즉 ThreadNObjectChild객체를 생성해서 스레드가 구동이 되어도. ThreadNObjectChild안에 있는 display메소드는 2개의 스레드가 생성이 될때 전혀 관계가 없다. 같은 클래의 안에 있어서 객체가 생성되서 콜이 되어도 main에서 콜할때만 "called by main()"만 찍히기 tno1, tno2에 의한 System.out.println은 없다. 따라서 쓰레드는 객체 생성에 의해서 스레드가 생성될때 그 안의 모든 메소드에 영.. 더보기
자바 쓰레드(Thread) - Thread와 객체의 관계 1. Thread는 객체와 직교하는 개념이다. - 객체가 독립된 스레드에서 움직이고 있는것은 아니다. - 멀티 스레드는 어디까지나 스레드라는 처리 흐름이 여러개 존재 할 수 있다는 의미이다. - 어떤 스레드에서 움직이기 시작한 메서드가 다른 메서드를 호출했을 때 호출된 측의 메서드와 동일한 스레드에서 동작한다. - 스레드의 경계와 객체의 경계는 전혀 관계가 없다. 더보기