본문 바로가기

자바쓰레드

자바 쓰레드(Thread) - Atomic 예제 동기화를 배울때 synchronized와 volatile을 공부했다. synchronized는 메소드 시그니쳐나 블럭(?)을 지정할때 volatile은 변수에 대한 동기화였다. 아래 예제를 보자. 예제는 백만까지 for루프를 돌면서 합계를 구하는 것이다. 위의 예제를 돌려보면 결과값이 499999500000 나온다(백만의 합계이다) 걸린 시간은 대략 컴퓨터에 따라 다르지만 내 컴퓨터 기준으로는 32ms 다.(내 컴이 꾸리다) 그럼 쓰레드를 두개 생성후 돌리면 어떻게 될까? 499999500000 * 2 = 999999000000 가 나와야 하지 않을까? 근데 아니다. 가끔씩 값이 다르게 나온다.(아래처럼) 이유는 아무리 변수에 대한 volatile처리를 했어도 add메소드에서 동시에 두개가 작업이 들어가.. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 join() 예제 아래 예제 목적은 메인에서 다른쓰레드 종료후 프로그램을 종료하기 위함이다. 소스 메인 메소드 보면 메인스레드 종료라는 메세지를 찍었는데 목적은 이 메세지가 가장 늦게 찍게 함이다. 이럴때 join()를 사용하면 메인에서 사용되었던 쓰레드들이 다 종료후 마지막으로 메인쓰레드가 종료된다. 메인쓰레드가 가장 늦게 종료한다는 관점에서 isAlive()와 비슷한 역할을 한다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 isAlive() 예제 보통 쓰레드로 프로그래밍을 할때 main쓰레드에서 자식 쓰레드를 생성후 자식 쓰레드들이 다 끝난 다음에 main쓰레드를 마쳐야 한다. 이럴때 main에서는 자식쓰레드들이 끝날때까지 기달려야 하는데 이럴때 isAlive()메소드를 사용하면 된다. 아래 예제는 메인에서 세개의 쓰레드 생성후 마칠때까지 메인에서 while문으로 점을 찍는데 이때 체크를 isAlive로 하였다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 Life Cycle 더보기
자바 쓰레드(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는 객체와 직교하는 개념이다. - 객체가 독립된 스레드에서 움직이고 있는것은 아니다. - 멀티 스레드는 어디까지나 스레드라는 처리 흐름이 여러개 존재 할 수 있다는 의미이다. - 어떤 스레드에서 움직이기 시작한 메서드가 다른 메서드를 호출했을 때 호출된 측의 메서드와 동일한 스레드에서 동작한다. - 스레드의 경계와 객체의 경계는 전혀 관계가 없다. 더보기
자바 쓰레드(Thread) - 싱글쓰레드(single thread)와 멀티쓰레드(multi thread) 예제 2 1. 첫번째 예제 : 싱글쓰레드 javax.swing을 이용해서 입력받는 패널을 띄운다. 입력 값을 받으면 값을 콘솔에 찍고 그 다음에 for문을 돈다. 이 이야기는 입력 받은 값이 없으면 프로그램이 거기서 멈추고 for문을 타지 않는다. 전형적인 싱글쓰레드다. 2. 첫번째 예제 : 멀티쓰레드2 위의 싱글쓰레드에서 for문을 따로 뺐다. 그리고 Thread를 상속받아서 쓰레드로 만들었다. 이제는 input 패널이 뜨더라고 for문은 돈다. 멀티쓰레드다. 3. 두번째 예제 : 멀티쓰레드 위의 첫번째 예제에다가 10초동안 input패널에 값을 입력하지 않았을때 프로그램을 종료하도록 했다. 이를 위해서 메인메소드가 있는 클래스에 inputCheck라는 static boolean값을 생성하였다. 자식쓰레드중 f.. 더보기
자바 쓰레드(Thread) - 싱글쓰레드(single thread)와 멀티쓰레드(multi thread) 예제 처음에 *을 300개 찍고 다음에 #을 300개 찍는걸로 싱글쓰레드와 멀티쓰레드로 나누어 보자. 1. 싱글쓰레드 방법 2. 멀티쓰레드 - 멀티 쓰레드는 클래스를 두개로 나누었다. 메인 메소드가 있는 클래스. 어차피 메인 메소드도 쓰레드라고 했다. 메인 메소드에서 자식 쓰레드를 호출해서 동시에 시작한다. 자식쓰레드 더보기
자바 쓰레드(Thread) - 멀티 쓰레드(Multi-Thread) * 스레드 기반 멀티 태스킹에서는 스레드가 가장 작은 코드 단위이다. * 즉, 단일 프로그램이 두개 이상의 태스크(task)를 동시에 수행할 수 있다는 것을 의미(멀티쓰레딩) * 프로그램에서 발생하는 유휴시간(idle time)을 이용할 수 있는 효율적인 프로그램을 개발 가능 * 대부분의 I/O장치는 CPU보다 느리기 때문에, 이들을 사용하는 프로그램은 많은 시간을 이들로부터 정보를 주고 받는 과정에서 소비한다. * 멀티 쓰레딩을 이용하면 이러한 유휴시킨에 다른 태스크를 수행할 수 있다. * 멀티 쓰레딩이 지원되지 않던 시절에는 이터럽트 등의 편범을 이용해서 프로그래밍 * 자바에서는 언어 차원에서 스레드를 지원한다. * 모든 프로세스는 적어도 하나의 실행되는 스레드를 갖고 있어야 하며, 프로그램이 시작 .. 더보기
자바 쓰레드(Thread) - 멀티 태스킹 (Multi-Tasking) 1. 멀티 태스킹 - Multi-Tasking (= 멀티프로세스와 거의 유사함) * 하나의 CPU가 여러 개의 프로세스를 교대로 수행하는것 * 각각의 일을 전담하는 해당 프로그램들이 동시에 실행되고 있다는것을 의미 * 일반적으로 멀티 태스킹을 위해서는 여러 개의 프로세스가 메모리 상에서 동시에 실행 * 현재 운영체제들이 취한 방식은 멀티 프로세스 시스템이다. * 멀티 프로세스 시스템에서 각 프로세스는 동시에 실행되는 것처럼 보이지만, CPU가 하나이기 때문에 , 실은 실행 시간을 잘게 나누어서 각 프로세스들이 돌아가면서 CPU를 점유하고 있는 것이다. * 프로세스간의 이런 CPU의 점유작업을 ProcessScheduling이라고 한다. * 프로세스는 실행중인 프로그램이다. * 스케줄러에 의해 처리되는 가.. 더보기