Wanna be Brilliant Full-Stack Developer
자바 스레드 실습 해보자! 본문
자바는 기본적으로 하나의 스레드만 가지고 있다.
자바를 번개맨 아저씨라고 하면 번개맨 아저씨가 여기에만 시험을 치를 수가 있다.
여기에서만 일을 하고 메인스레드 밖에 없다.
실행하면 1부터 10까지 찍힌다!
println 말고 print라고 하면
내려쓰기가 안되고 옆에 나온다.
메인스레드가 10개를 출력을 한다!
너무 빠르게 찍히니까 조금만 천천히 찍어보려고 한다.
Thread.sleep이라는 잠자는 메서드가 있는데 밀리 세컨즈는 1000분의 1초를 말하는데 1000이라고 하면 1초이다.
근데 지금 여기서 오류가 난다.
그 밑에 Surround with try/catch가 보인다.
여기서 실행을하면 1초씩 쉬었다가 실행이 된다.
try catch는 지금은 잘몰라도 된다. 나중에 배울것이다.
이렇게만 출력을하고 자동으로 종료가 되는것이 자바의 메인 스레드이다.
그러면 시험을 치를수있는 공간을 하나 더 만들려고하면?
하나의 클래스를 만들고 implements를 하여 runnable이라는 것이 있다.
runnable은 무엇인가?
컨트롤 해서 들어가면 Runnable이라는 인터페이스는 run이라는 추상메서드를 가지고 있다.
run이라는 추상메서드를 강제적으로 구현 해줘야한다.
자바의 서브 스레드가 스레드가 또 될수가 있는데 지금 이상태에서 실행을 해도 아무 일이 없다.
SubThread가 메모리에 뜨지도 않았기 떄문이다.
이렇게 만들고 SubThread를 실행하려면 조건이 무엇인가?
Thread라는 객체를 하나 만든다.
지금 자바가 맨처음 실행되면 메인 스레드가 실행이 된다.
스레드가 하나이다.
그러면 여기에 코드가 라인이
22번 라인부터 32번 라인까지 있다.
25번라인은 for문 expreesion이니까 22번부터 25번라인까지 있다고하자.
자바는 22번부터 25번까지 실행이되면 끝이나는 프로그램이다.
프로그램에서 22번에서 SubThread라는 객체를 하나 만들었다.
애를 new를 하면 SubThread라는 객체를 하나 생성했다.
그러면 heap공간에 무엇이 만들어지는가?
Subthread가 만들어진다.
그리고 애의 부모는 Runnable이였다.
22번 라인이 바라보고 있는것은?
Subthread니까 바라보고 있는것은 SubThread를 바라보고 있다.
그리고 애가 들고 있는 메서드가 Run을 들고 있고 둘다 run을 들고 있으니까 자식이 부모의 메서드를 오버라이드 했다.
그러면 부모꺼는 무효화 되었다.
왜 무효화 되었냐면 부모가 Run 메서드를\ 들고 있는데 자식도 Run을 들고 있으니까 부모가 무효화 된것이다.
23번은 Thread라는 객체가 만들어진다. 23번 라인에서 Thread객체가 생성이 된다.
Thread객체개 생성이 될떄 새로운 스레드가 하나 만들어진다.
새로운 스레드가 만들어지는데
이자리가 비어있고 무슨 스레드인지는 모르겠는데 스레드가 만들어진다.
메인 스레드의 일생은 22번부터 25번까지 실행하면 끝인데 23번에스 스레드를 하나 만들었는데
어떤 스레드인지는 모르지만 스레드가 만들어졌다.
그러면 여기서 Thread라는걸 컨트롤 클릭을 하면
생성자이다. 생성자를 보면 this가 보인다. this는 자기자신을 실행하는것인데
컨트롤 클릭을 해보면 Thread라는 생성자가 천천히 내려보면 오버로딩이 되어있다.
함수의 이름은 같은데 매개변수가 다른것을 오버로딩이라고 말을 했다.
오버로딩이 되어있는것을 보면 Runnable의 target이 보인다.
이 target의 type의 runnable 타입만 들어올수 있는데 들어올수있는 Runnable 타입이
SUbthread타입은 무슨 타입인가? 다형성으로서 Subthread 이기도 하지만 Runnable이기도 하다.
부모가 Runnable이니까!
그러면 Thread() 에 들어올수 있는건 st를 넣을 수 있다. 넣고 컨트롤 누르면
target에 SubThread가 들어온다. st가 들어가 있는 자리가 target을 선정하는 자리이다.
target을 선정하면서 스레드를 만들어야지 그래야지
이자리에 target이 만들어진다. 지금 target이 무엇인가? SubThread의 Run 메서드이다.
메인세러드의 타겟은 main이고 run 스레드의 타겟은 Run이다. 이제는 Run 스레드가 만들어졌다.
이제 Run스레드는 이 run 메서드의 내부를 자바의 SubThread가 되는것이다.
아직 실행은 되지 않았다.
이제 타깃 선정이 끝났기 떄문에 8번라인부터 들어온다.
아직 실행은 되지 않았다. 22번과 23번은 실행되었다.
24번라인에서 무엇을 할것인가?
t1.start()'; 라는 메서드를 호출한다. 이게 Run메서드 실행하는 것이다.
24번 라인은 Run 스타트이다. Run이 실행이 된다. 24번 라인이 실행이 되는 순간
무슨일이 일어나는가? 24번이 8번 라인을 실행 시킨다.
실행시키고나서 어떻게 하는가? 8번라인이 끝날떄까지 기다리는것이 아니라 5초정도 걸리는데
그래서 8번라인을 실행시키고나서 바로 내려와서 25번라인의 For문을 실행시킨다.
애를 실행시키고 새로운에게 Run스레드를 맡기고 25번을 실행 시킨다.
실행이 어떻게 되는가? 왔다갔다 한다. 8번 라인에 0.01초 정도 실행했다가
25번라인을 0.01초정도 실행했다가 계속 왔다갔다를 한다.
이 8번라인이 끝날떄까지 기다리는것이 아니라 8번라인을 실행시켜놓고
메인 스레드는 독립적으로 자기의 실행을 계쏙 이어나가고
이 Run스레드도 자기의 일을 독립적으로 실행을 이어나간다.
따로 실행하는것처럼 보이지만 결국 왔다갔다 한다는 포인트를 기억해야한다.
왔다갔다 할때는 머가 장점이라고 헀느냐?
눈속임이 되지만 힘들다고 했다.
그리고 왔다갔다 하는것을 머라고 했지?
문맥을 교환한다고 했다.
왔다갔다 하니까 문맥을 교환한다고 한다. 이걸 정확한 용어로 영어로 하면
Context가 Switching 한다고 한다.
그래서 실행을 한번 해보자!
왔다갔다 한다. 한쪽을 끝내고 애를 실행하는것이아니라 왔따갔다 하는것이 스레드이다.
스레드의 핵심이 무엇인가?
스레드 객체를 하나만들어서 하나의 박스를 만든다.
이 Run메서드 하나를 만들어서 거기에 타겟을 설정한다 타겟 설정이 필요하다!
타겟을 넣는다는건 무슨뜻인가?
SubThread가 저기 딱 들어가는 순간 Run메서드가 타겟이 된다.
이 상태에서 실행을 시켜주는데 그러면 왔다갔다 실행 하게 된다.
원래 메서드는 실행을 하게되면 원래 그 실행이 끝날떄까지 기다렸다가
실행하게 되는데 애는 메서드가 아니라 스레드이기 때문에 스레드라고 한다.
왔다갔다 하는걸 기억하면 된다.
첫번쨰 박스를 만들자
스레드 객체를 만들다.
두번쨰 스레드객체의 타겟을 설정하자
타겟은 Runnable타입이 무조건 이다.
Runnable타입을 지정안하면 타겟에 넣지를 못한다
그다음에 스레드를 실행하면 run메서드가 실행이 되는데
그걸 실행시키고나서
메인메서드는 자기 일을하고 SUbthread도 자기일을 하는것이다!
'Some Memos > Java' 카테고리의 다른 글
자바 예외처리( 컴파일, 런타임) (0) | 2023.03.28 |
---|---|
자바 동기와 비동기가 무엇인가? (0) | 2023.03.28 |
자바 스레드 가 무엇인지 알아보자! (0) | 2023.03.20 |
자바 컬렉션이란 무엇인가요?! (0) | 2023.03.18 |
자바 제네릭고급(와일드카드) 란 무엇인가? (0) | 2023.03.18 |