본문 바로가기
IT /1) 자바

자바독학)Thread, sleep, run,백그라운드

by 세세tv 2019. 10. 27.

 

프로젝트명 : G8_Thread

패키지명 : single_thread

클래스명 : B1_Thread, Th_Main

 

사진을 좀 소박하게 캡쳐해왔습니다.

 

클래스 2개로 나누어서 시작해보겠습니다.

 

 

Thread는 독립적으로 실행합니다!

지금까지 main에서 호출하면

위에서 아래로 왼쪽에서 오른쪽으로

순서대로 일을했습니다.

 

Thread는 동시에 일을 진행합니다.

 

일상과 비유하자면

저희 어플로 음악을 켜놓고

카카오톡이 가능한 것과 같습니다.

 

한 번에 두가지 이상의 프로세스를 실행하는 겁니다.

 

thread의 사용법입니다.

1. thread를 extends로 상속받는다.

1번 먼저 확인해보겠습니다.

 

 

Thread를 extends로 상속받았습니다.

 

run이라는 메서드를 상속받습니다!

무조건 오버라이딩해야합니다.

 

run+자동완성으로 쉽게 만들어주겠습니다

자동완성키는 ctrl+space bar입니다.

 

super.run();은 의미없는 내용이겠죠?

thread의 run이니깐 아무 내용 없다는 뜻입니다.

 

 

run메서드에서 for문을 생성하여

10번 반복하여 출력해주겠습니다

 

run내부에서 작성한 코드가

메인과 별개로 백그라운드에서 동작합니다.

 

 

t.run을 사용하면 백그라운드가 아닌

메인에서 실행됩니다.

 

run메서드의 경우 t.start();를 해줘야

백그라운드에서 동작합니다.

 

실제로 눈으로 보이기에는

main에서 t.run실행되고 "메인 스레드 종료"실행되고

t.start();가 실행됩니다.

 

t.start();가 "메인 스레드 종료"보다 위에있지만

더 늦게 호출되었습니다.

 

대부분 메인이 더 빠르게 움직이게됩니다.

 

 

패키지명 : multi_thread

클래스명 : Th_Main, Th1, Th2

 

클래스 3개를 생성해서 여러개 만들어보겠습니다.

 

 

Th1, Th2 모두 Thread를

extends를 사용하여 상속받겠습니다.

 

Th1에는 @를 50번 출력하고!

Th2에는 ~를 50번 출력해주겠습니다.

 

 

 

메인으로 이동하여 Th1, Th2를 호출하고

둘 다 start();를 사용하여 호출해봤습니다.

메인에는 스레드 종료를 출력해봤습니다.

 

콘솔을 보니 역시나 메인이 가장먼저 실행되고

thread가 실행되는데!

 

번갈아가면서 찍고있습니다.

 

 

위와 같은 경우에 가까운 위치에서 thread를 여러개 호출하면

어떤 thread가 먼저 실행될지 예측할 수 없습니다.

 

위의경우는 @가 먼저 호출되었고

그 이전에는 ~가 먼저 호출되었습니다.

 

thread는 완전독립이 아닙니다.

 

예를들어

th1에서 0.0000001초 th2에서 0.0000001초

이런식으로 번갈아가며 실행되는데

그 속도가 매우 빠르기에 동시실행되는 것처럼 느껴집니다.

 

 

패키지명 : thread_sleep

클래스명 : Thread_Main, Thread1

 

클래스 두개 만들아 주겠습니다.

클래스명의 경우 Thread라는 이름을 사용하지 않습니다.

 

클래스명을 Thread로 만들면

extends를 하면 생성한 클래스를 상속하겠죠?

저희는 자바프로그램이 가진 Thread를 상속받아야합니다.

 

 

Thread1클래스에서 Thread를 상속받고

run을 오버라이딩 해주겠습니다.

 

for문에서 10번반복하며

Thread.sleep(1000); 해보니 오류가 발생합니다!

 

마우스를 올려보니

try/catch를 생성하라고 하네요!

 

클릭하여 만들어주겠습니다.

 

 

여기서 1000은 1초입니다.

밀리세컨인가 그래서 1000을 1초로 계산합니다.

 

catch에서 오류명이 InterruptedException이네요

나중에 위와같은 오류가 발생하면 알아볼 수 있게

외우지는 못하더라도 슥 봐주겠습니다.

 

어차피 오류뜨면 검색하는게 더 빠르거든요 ㅎㅎ

 

try/catch를 사용하는 이유는 간단합니다.

프로그램을 대기시키는 동안 발생하는 오류가 있을 수 있습니다.

 

오류를 잡기위해서 catch가 있어야겠죠?

 

 

메인에서 클래스 호출하고 start();를 사용하여

출력해보니 빨간네모가 있어요!!

 

뭔가 실행되고있습니다.

 

현재 0,1,2,3이 출력되었네요.

 

 

0~9까지 1초마다 1씩증가하며 숫자 10개를 10초동안 찍습니다.

 

참고로 저는 이 기능을 이용하여 위에서 물체가 떨어지고

그것을 피하는 게임을 만들어봤습니다.

 

0.1초당 물체가 아래로 떨어지는 그런 코드가 가능합니다.

 

 

메인에서도 Thread.sleep(1000);이가능합니다.

 

물론 import해주셔야하구요

try/catch말고 throws하는 방법이 있네요!

 

한번 사용해보겠습니다.

 

 

main옆에 throws를 사용하여 예외처리해주었습니다.

Thread.sleep(1000)에서 1초 대기하고 "가"를 출력합니다.

 

try/catch으로도 만들어 봤습니다.

1초 대기 후 blog를 출력합니다.

 

출력창을 보면 메인과 run에서 번갈아가며 출력합니다.

 

thread는 재미있게 공부가 가능할거같네요!

저는 재미있게 공부했습니다 ㅎㅎ

 

Thread, sleep, run,백그라운드

댓글