본문 바로가기
Android

[Kotlin] Background Thread (ThreadExecutor 사용하기)

by bryan.oh 2023. 8. 18.
반응형

 

UI Thread 가 아닌 Background Thread 에서 작업하기 위해서 ThreadExecutor 를 생성

백그라운드 스레드를 사용하는 이유는 메인(UI) 스레드에서 긴 작업을 수행하면 앱이 응답하지 않거나 끊어지는 문제를 피하기 위해서입니다
class HttpActivity : AppCompatActivity() {
    val executor: ExecutorService = Executors.newSingleThreadExecutor()
    
}

버튼 클릭하면 실행 하도록, onCreate 안에 click event 작성

binding.httpSendButton.setOnClickListener {
    executor.execute{
        val url = binding.httpUrlEditText.text.toString()
        request(url)
    }
}

 

Executor

  • SingleThreadExecutor: 하나의 스레드에서 작업을 처리하는 Executor입니다. 순차적으로 작업을 처리하며, 작업이 순차적으로 실행되어야 하는 경우에 유용합니다.
  • FixedThreadPool: 고정된 개수의 스레드 풀을 생성하고 작업을 분배합니다. 병렬로 일정한 수의 작업을 처리하고자 할 때 유용합니다.
  • CachedThreadPool: 필요한 만큼의 스레드를 동적으로 생성하고 관리하는 Executor입니다. 스레드 풀 크기를 제한하지 않아 대규모 작업에 유용합니다.
  • ScheduledThreadPool: 작업을 지정된 시간에 실행하거나 주기적으로 실행하는 Executor입니다. 일정한 주기로 작업을 실행하고 싶을 때 유용합니다.
  • MainThreadExecutor: Android의 UI 스레드에서 작업을 처리하는 Executor입니다. 주로 UI 업데이트와 관련된 작업을 처리할 때 사용합니다.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val singleExecutor = Executors.newSingleThreadExecutor()
        val fixedExecutor = Executors.newFixedThreadPool(3)
        val cachedExecutor = Executors.newCachedThreadPool()
        val scheduledExecutor: ScheduledExecutorService = Executors.newScheduledThreadPool(1)

        // SingleThreadExecutor 예제
        singleExecutor.execute {
            for (i in 1..5) {
                println("SingleThreadExecutor: $i")
                Thread.sleep(1000)
            }
        }

        // FixedThreadPool 예제
        for (i in 1..3) {
            fixedExecutor.execute {
                for (j in 1..5) {
                    println("FixedThreadPool-$i: $j")
                    Thread.sleep(1000)
                }
            }
        }

        // CachedThreadPool 예제
        for (i in 1..5) {
            cachedExecutor.execute {
                println("CachedThreadPool-$i")
                Thread.sleep(1000)
            }
        }

        // ScheduledThreadPool 예제
        scheduledExecutor.scheduleAtFixedRate({
            println("ScheduledThreadPool: ${System.currentTimeMillis()}")
        }, 0, 1, TimeUnit.SECONDS)
    }
}

 

Thread

Executor 를 사용하지 않고 Thread 를 사용할 수 도 있습니다.
    binding.httpSendButton.setOnClickListener {
        Thread {
            val url = binding.httpUrlEditText.text.toString()
            request(url)
        }.start()
    }

 

 

[참고] UI Thread 가 아닌 Thread 안에서 UI 에 접근할때는 runOnUiThread 를 사용해야 합니다.
runOnUiThread {
    binding.httpResultTextView.setText(content)
}

 

728x90
반응형

댓글