Coroutine 실습은 다음 글에서 하겠습니다 (Coroutine -2) 이번 글에서는 Thread를 위주로 작성합니다 !
1. Android
안드로이드는 리스너의 집합이다 사용자가 버튼을 언제 누를지 모르기에 리스너를 사용힘. 사용자가 버튼을 눌렀을 때 리스너가 작동하도록 하는 원리임! 리스너 - 사건이 발생했다(사용자에 의한 OR 안드로이드 os에 의한) 는 메시지가 들어오면 동작하는 애
2. Coroutine
- Kotlin만 사용가능
클라이언트와 서버간의 네트워크 통신으로 서로 데이터를 주고 받고 하는 것 리스너안에 리스너안에 리스너안에 리스너안에 리스너...... <- 괄호가 몇개인가.... 이를 해결하기 위해 작업1 통신대기하다가 끝나면 작업2 대기 통신하고 끝나면 작업3 대기 이런식으로의 방식을 사용하는 것
3. Thread
▼ Thread 사용하는 경우 - 예시
fun main(){
var a1 = 0
while(a1<10){
Thread.sleep(100)
println("a1 : $a1")
a1++
}
var a2 = 0
while (a2<10){
Thread.sleep(100)
println("a2 :$a2")
a2++
}
}
위의 코드는 다음과 같이 실행된다. 근데 이때, while문 두 개를 동시에 동작하도록 하고 싶다면 ??? 이럴 경우에 Thread를 사용한다 !!
▼ Thread를 사용해보자 ! -while문 두 개가 동시 실행되도록 코드를 작성해보자 !
<방법1> <방법2> <방법3>
(바쁘신 분들은 <방법3> 으로 바로 가시면 될 것 같네용)
미리 말하자면 코드는 항상 위에서 아래로 흘러가는데 하나의 Thread안에서 위에서 아래로 돌아가는 것이다 !
<방법1> Thread 상속 이용
- Thread 클래스를 상속받은 클래스를 만들어준다.
fun main(){
// Thread를 가동한다.
val t1 = ThreadClass()
t1.start()
var a1 = 0
while(a1<10){
Thread.sleep(100)
println("a1 : $a1")
a1++
}
}
class ThreadClass : Thread(){
// 별도의 쓰레드를 발생시켜 처리할 코드가 있는 메서드
override fun run() {
var a2 = 0
while (a2<10){
Thread.sleep(100)
println("a2 :$a2")
a2++
}
}
}
위와 같이 각각의 while문 a1, a2가 같이 실행됨을 볼 수 있다.
<방법2> interface를 이용한 Thread이용
- interface에는 startMethod가 없으니까 객체를 만든 후, startMethod있는 Thread함수에 담아서 사용
import kotlin.concurrent.thread
fun main(){
// Thread를 가동한다.
val r2 = RunnableClass()
val t2 = Thread(r2)
t2.start()
var a1 = 0
while(a1<10){
Thread.sleep(100)
println("a1 : $a1")
a1++
}
}
// Runnable 인터페이스를 구현한 클래스
class RunnableClass : Runnable{
// 별도의 쓰래드를 발생시켜 처리할 코드가 있는 메서드
override fun run() {
var a3 = 0
while(a3 < 10){
Thread.sleep(100)
println("a3 : $a3")
a3++
}
}
}
다음과 같이 결과가 출력된다.
<방법3> Thread 코드 블럭 사용
-코드 블럭 내의 작성한 코드를 별도의 쓰레드로 가동시켜준다
import kotlin.concurrent.thread
fun main(){
thread {
var a4 = 0
while (a4 < 10){
Thread.sleep(100)
println("a4 : $a4")
a4++
}
}
var a1 = 0
while(a1<10){
Thread.sleep(100)
println("a1 : $a1")
a1++
}
}
가장 간단하고 많이 쓰는 방법인 것 같다 .ㅎㅎ 위의 결과들과 똑같이 두 개 while문이 thread를 통해 동시에 실행됨을 볼 수 있다.