티스토리 뷰
스레드는 하나의 프로세스 안에서 여러 가지 작업을 동시에 수행할 때 사용합니다.
스레드를 이용해 타이머와 스레드의 동작순서를 보여주는 앱을 보여드리겠습니다.
하단에 버튼이 3개가 있고 각각 누르면 해당 버튼 위의 텍스트가 동작하도록 만들었습니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.33" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.66" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="#ffffff"
android:onClick="bt1"
android:text="스레드1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="#ffffff"
android:onClick="bt2"
android:text="스레드2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="@+id/guideline" />
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="#ffffff"
android:onClick="bt3"
android:text="스레드3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.ehsehsl.osz;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView, textView2, textView3;
int count = 0;
String text = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
textView2 = findViewById(R.id.textView2);
textView3 = findViewById(R.id.textView3);
}
public void bt1(View view) {
new Thread(new Runnable() { // 스레드 생성
@Override
public void run() { // 스레드 런
while (true) {
count++;
runOnUiThread(new Runnable() { // 스레드에서 Ui 수정하려면 추가
@Override
public void run() {
textView.setText(Integer.toString(count)); // 텍스트뷰 수정
}
});
try { // 슬립은 트라이 안에
Thread.sleep(1000); // 딜레이 1초
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void bt2(View view) { // 스레드2 누르면 실행됨
text = ""; // text 초기화
Thread2 thread = new Thread2();
thread.start();
text += "end";
textView2.setText(text);
}
class Thread2 extends Thread {
public void run() {
text += "thread\n";
}
}
public void bt3(View view) { // 스레드3 누르면 실행됨
text = "";
Thread3 thread = new Thread3();
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
text += "end";
textView3.setText(text);
}
class Thread3 extends Thread {
public void run() {
text += "thread\n";
}
}
}
스레드1을 누르면 bt1이 실행되어 1초마다 +1이 됩니다.
스레드 런 안에 runOnUiThread가 있는데 스레드에서 Ui를 수정할 땐 핸들러를 이용하거나 runOnUiThread을 이용하면 됩니다.
그냥 스레드에서 수정하면 에러가 발생합니다.
스레드2와 스레드3을 누르면 실행되는 bt2와 bt3은 join을 알아보기 위한 코드입니다.
스레드2를 누르면 bt2가 실행되어 text를 초기화하고 스레드를 시작하고 스레드에서는 text에 thread를 추가하고 스레드 스타트 아래에는 text에 end를 추가하고 텍스트뷰에 보여줍니다.
하지만 화면을 보면 thread을 없고 end만 나타나있습니다.
Thread2 안에서의 코드보다 bt2의 코드가 먼저 끝났기 때문입니다.
bt3은 bt2에서 join이 추가되었습니다.
join을 해주면 해당 스레드가 종료될 때까지 기다려줍니다.
덕분에 순서대로 실행되어 화면과 같이 thread\nend가 출력되는 모습을 볼 수 있습니다.
'안드로이드 네이티브' 카테고리의 다른 글
안드로이드 동영상 실행시키기 (앨범에서 선택, 웹에서 불러오기, 앱 내부 영상) (0) | 2020.10.01 |
---|---|
안드로이드 앨범에서 사진 불러와 보여주고 내부저장소에 저장과 삭제하기 (0) | 2020.09.30 |
안드로이드 웹뷰 사용과 웹으로 이동해보기 (추가로 http 연결하기) (0) | 2020.09.14 |
안드로이드 UI 보이게 안 보이게 하는 방법 (visibility) (0) | 2020.09.13 |
안드로이드 클립보드에 저장하기 ClipboardManager (0) | 2020.09.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 챗봇
- 오토핫키
- 안드로이드앱
- 카카오봇
- 구구단어플
- 안드로이드앱개발
- JS
- 로또
- 자동답장
- 구구단
- 노래
- loop
- 플러터
- 채팅
- 카카오톡
- 구구단앱
- 안드로이드네이티브
- 코틀린
- Flutter
- 매크로
- sendinput
- MouseMove
- 안드로이드클라이언트
- 앱개발
- 안드로이드스튜디오
- inputbox
- 자바스크립트
- 구구단공부
- 명언
- 안드로이드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함