Day29 - Thread 쓰레드

2021. 3. 26. 16:15JAVA 공부

오늘은 한주의 마지막 평일인 금요일 입니다 ~

대면수업인 날이라서 학원에 출석을 했어요 ㅠㅠ

그리고, 오늘은 학원이 4시에 끝나는 마지막 날이라서 슬픕니다.

그리고 배우고 있는 JAVA도 마지막이라고 해요 ~

 

오늘은 Thread 쓰레드에 대해서 알아 봅시다

Thread

쓰레드는 프로그램의 실행 흐름 입니다

그런데 이러한 쓰레드는 1개 뿐 아니라 여러개가 존재할 수 있습니다.

 

예를 들어서, 저희가 사용하는 윈도우가 있습니다. 윈도우에 인터넷을 키고, 게임을 키고, 카카오톡을 키고, 등등 여러가지를 한번에 켜서 사용할 수 있죠?

이러한 기능이 바로 멀티 쓰레드 입니다.

 

쓰레드의 사용방법을 알아 봅시다.

쓰레드는 2가지 방법으로 사용할 수 있는데,

1. implements Runnable 해서 사용하기

2. extends Thread 해서 사용하기

 

각각의 사용방법을 한번 알아 봅시다

 

implements Runnable 을 사용하기

interface 인 Runnable 을 사용하는 것이기 때문에, 오버라이딩을 꼭 해주어야 합니다.

run 이라는 메서드를 오버라이딩 하면 되는데, run()메서드 안에는 실행하고 싶은 코드를 넣어주면 됩니다.

Thread.currentThread() -> 현재 쓰레드를 가져옵니다.

Thread.sleep(value) -> 밀리초 단위로 정지합니다

 

이렇게 만든 클래스를 Main에서 사용해 봅시다

implements Runnable 을 사용한 경우에는 클래스를 객체화 하고, Thread 클래스도 만들어서, Runnable해준 클래스를 넣어주면 됩니다. "쓰레드 1" 은 쓰레드의 이름을 지정해주는 것을 의미합니다.

쓰레드를 실행시킬 경우에는 start() 를 써주면 됩니다.

실행코드를 보면, 메인이 종료되기 전에 "메인쓰레드 종료" 를 출력하라고 했는데, run() 에 있던 코드가 뒤에 실행이 됐죠? 이렇게, 실행 흐름을 추가하는 것입니다.

 

extends Thread 를 사용하기

이번에는 extends Thread를 사용해서 해봅시다.

extends 는 상속이죠? 상속을 하는 것이기 때문에, 따로 오버라이딩을 꼭 해줘야 한다거나 하는건 아니지만, run() 을 오버라이딩 해줘야 저희가 원하는 대로 만들 수 있습니다.

getName() , sleep() 앞에 Thread. 이 안붙었죠? 그 이유는 클래스를 상속 받았기 때문입니다.

상속을 받아서, 부모의 변수나 메서드를 가지고 있기 때문이에요 ~

 

main 에서도 따로 Thread 를 만들어 줄 필요 없이, 만든 클래스를 객체화 하고 그냥 start()를 사용해주면 됩니다.

 

예제를 조금 더 봅시다

위에 만든 Thread 를 객체2개와 쓰레드2개로 사용하는 것, 객체1개와 쓰레드2개로 사용하는 것. 을 확인해 봅시다

 

- 객체 2개, 쓰레드 2개

- 객체 1개, 쓰레드 2개

객체 1개를 쓰레드 여러개로 사용할 경우, 이렇게 멤버변수의 값을 같이 사용하는 현상을 발견 할 수 있습니다.

 

Sinsynchronized

synchronized는 스레드가 사용중인 객체를 다른 스레드가 변경할 수 없도록 객체에 lock을 걸어 줍니다

A 쓰레드가 먼저 이 객체를 사용하는 동안 B 쓰레드는 사용할 수 없기 때문에, A가 먼저 다 실행이 된 후에 B가 실행이 된 걸 확인 할 수 있습니다.

 

오늘은 이렇게 Thread에 대해 알아 보았습니다.

 

고생하셨습니다. 오늘로 Java는 끝났습니다 ~

 

배우지 않은 부분도 있는데...  javaNet 과 Fx 라고 합니다.

javaNet은 서버 관련된 건데, 뒤에 다른 언어를 할 때 배우기 때문에 그 때 배울거라고 합니다.

Fx 는 몰라도 된다고 하시네요