본문 바로가기

Java

자바 쓰레드(Thread) - 쓰레드(Thread)의 isAlive() 예제 보통 쓰레드로 프로그래밍을 할때 main쓰레드에서 자식 쓰레드를 생성후 자식 쓰레드들이 다 끝난 다음에 main쓰레드를 마쳐야 한다. 이럴때 main에서는 자식쓰레드들이 끝날때까지 기달려야 하는데 이럴때 isAlive()메소드를 사용하면 된다. 아래 예제는 메인에서 세개의 쓰레드 생성후 마칠때까지 메인에서 while문으로 점을 찍는데 이때 체크를 isAlive로 하였다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 yield() 예제 yield의미는 사전적으로 양보의 뜻을 가지고 있다. 아래 예제에서 쓰레드3개를 생성하고 돌린다. 이론상으로 첫번째 쓰레드가 다 끝나고 두번째~ 세번째가 실행 될 수도 있는데 보통 요즘 OS에서는 알아서 interrupt를 걸어서 서로서로 실행 하는걸 볼 수있다. 자바에서도 그런 역할을 하는것중 하나가 yield() 메소드이다. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 Life Cycle 더보기
자바 쓰레드(Thread) - 데몬쓰레드(Daemon Thread) 1. 데몬쓰레드가 아닌 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행 2. 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료 3. 예로서 가비지 컬렉터, 워드 프로세서의 자동 저장, 화면 자동 갱신등이 있다. 4. 쓰레드를 생성한 다음 실행전에 setDㅁemon(true)를 호출. 쓰레드 종류는 크게 두가지다 : 사용자 쓰레드, 데몬 쓰레드. 이전에 했던 예제는 전부 사용자 쓰레드였다. 사용자 쓰레드는 독립쓰레드고 데몬쓰레드는 종속 쓰레드이다. 예제를 보자 1. 첫번째 예제 티스토리나 포털 사이트 게시판을 보면 임시저장..알아서 자동저장하는 기능들이 있다. 아무튼 이와 비슷하게 쓰레드를 이용해서 구현할수 있다. 다만 여기서 보여주는건 데몬은 보조적인 역할이라고 했는데 그걸 확인해보고.. 더보기
자바 쓰레드(Thread) - 쓰레드그룹(ThreadGroup) 예제 1. 서로 관련된 스레드를 그룹으로 다루기 위한것 2. 스레드 그룹에 다른 스레드 그룹을 포함 시킬 수 있다. 3. 보안상의 이유로 도입된 개념 - 자신이 속한 스레드 그룹이나 하위 스레드 그룹은 변경 할 수 있지만, 다른 스레드 그룹의 스레드를 변경 할 수 없다. 4. 모든 스레드는 반드시 스레드 그룹에 포함되어 있어야 한다. - 스레드 그룹을 지정하는 생성자를 사용하지 않는 스레드는 기본적으로 자신을 생성한 스레드와 같은 그룹에 속하게 된다. 5. 자바 어플리케이션이 실행되면 JVM은 main과 system이라는 스레드 그룹을 만들고 JVM운영에 필요한 스레드들을 생성해서 이 스레드 그룹에 포함시킨다. - 우리가 생성하는 모든 스레드 그룹은 main 스레드의 하위 스레드 그룹이 되며, 스레드 그룹을 .. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 우선순위(Priority)예제 코딩을 하면서 직접 우선순위를 셋팅할 일은 거의 없다고 한다. 뭐 정말 한다면 말리진 안겠지만.. 그래도 어떻게 돌아 가는지 예제를 살펴보자. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 우선순위(Priority) * 스레드가 수행하는 작업의 중요도에 따라 스레드의 우선순위를 서로 다르게 지정하여 특정스레드가 더 많은 작업 시간을 갖도록 할 수 있다. - 우선순위의 낮고 높음은 상대적인 것이다. - 우선순위는 스레드를 생성한 스레드로부터 상속받는다. - 스레드를 실행하기 전에만 우선순위를 변경 할 수 있다. - 자바의 기본 선택 규칙은 고정 우선순위 스케줄링이다. - 수행가능한(Runnable)스레드 중(또는 모니터 획득을 기다리는 큐내의 스레드중) 가장 우선순위가 높은것에 코드 수행기회를 부여한다. - 같은 우선순위의 스레드에 대해서는 라운드 로빈 방식으로 선택한다. - 현재 수행중인 스레드 보다 높은 우선순위의 스레드가 수행 가능한 상태가 되면 바로 기회를 부여한다.(선점, preemption) void set.. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 중지 예제 1. flag방식으로 쓰레드 중지예제 코드를 보면 어렵지 않다. 메인 메소드에서 다른 클래스(스레드 상속) 객체 생성후 호출 그러면 StopThread에서 while문을 돌면서 Thread is alive를 찍는다. 그리고 난후 메인에서 잠깐 쉬고 플래그를 변경하는 메소드를 호출하면 플래그가 바뀌면서 스레드가 중지 된다. 스레드를 중지할수 있는 방법중 하나지만 만약 while문안의 로직이 엄청 복잡하고 오래 걸린다면 즉각 중지를 시키지 못하고 원하는 타이밍을 놓칠 경우도 있다. 조금 문제가 될수도 있다. 2. interrupt()를 이용한 예제 위의 예제를 interrupt()를 이용해서 바꿨다. 우선 메인 메소드에서 flag를 호출하는 메소드 대신(위의 예제 참조) 생성한 스레드 객체에 interrup.. 더보기
자바 쓰레드(Thread) - 쓰레드(Thread)의 중지 Thread를 시작시킨 이후 만약 글 Thread를 중간에 중지시키고 싶다면? - stop() : 자바 API에 보면 deprecated다. 사용하는걸 권장 안함. - flag이용 : 개발자가 특정 변수를 체크하면서 중지 시킬지 결정 - interrupt() : 현재 수행중인 명령을 중지 시킬때.(wait(), join(), sleep() 명령) 많이 권장되는 방법. InterruptedException을 발생 catch해서 후속 작업을 할 수도 있다. 더보기
자바 쓰레드(Thread) - start()와 run()에 대한 예제 start()와 run()에 대한 예제를 보자. 간단한 예제를 보자. 아래 두개의 클래스가 있다. 우선 메인 메소드가 있는 클래스에서 다른 클래스(스레드를 상속받은) 객체를 생성하고 start()메소드를 호출하면 스레드가 생성이 된다. 이 말은 start()를 호출하면 run()메소드가 호출되고 그 후 다시 시점은 메인메소드가 있는 클래스로 돌아 온다. 물론 run()에 의한 스레드는 독립적으로 작동이 되는 것이다. 그래서 main()에서 실행된 스레드 그리고 start()에 의한 스레드 총 2개가 있다. 그럼 아래 예제에서 보면 스레드를 상속받은 클래스에서 일부러 stack을 trace해보았다. 위의 오류를 보면 main메소드에서 실행되는것이 아니라 run->throwException으로 두단계로 끝냈.. 더보기