안드로이드 개발자의 창고
[8일차 Java] Thread 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
- 동기 : 작업을 순차적으로 처리하는 것을 의미한다.
- 비동기 : 동시에 여러 작업을 처리하는 것을 의미한다
📖 Thread란?
- Thread : 자바에서 비동기 처리를 지원하기 위해 제공하는 클래스
- 동기적인 작업 다수를 비동기적으로 처리하게 된다.
- 오류가 발생할 가능성이 높은 작업의 경우 별도의 쓰레드로 운영하면 안정적으로 운영할 수 있다.
📖 예제 코드
Thread를 상속받은 클래스(TestClass1)
// Thread를 상속받은 클래스
class TestClass1 extends Thread {
public void run() {
try {
for(int i=0; i<100; i++) {
Thread.sleep(500);
System.out.println("TestClass1");
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
Runnable 인터페이스를 구현한 클래스
// runnable 인터페이스를 구현한 클래스
class TestClass2 implements Runnable{
@Override
public void run() {
try {
for(int i = 0 ; i < 100 ; i++) {
Thread.sleep(300);
System.out.println("TestClass2");
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
main 클래스
public class MainClass {
public static void main(String[] args) {
// Thread 클래스를 상속받은 쓰레드 클래스
TestClass1 t1 = new TestClass1();
t1.start(); // 비동기
// Runnable 인터페이스를 구현한 클래스
TestClass2 t2 = new TestClass2();
Thread thread = new Thread(t2);
thread.start();
try {
for(int i = 0 ; i < 100 ; i++) {
Thread.sleep(1000);
System.out.println("main");
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
✔️ 코드 해석
- t1.start();
- 쓰레드를 상속받은 클래스의 객체를 생성한다.
- 해당 코드는 비동기적으로 처리하기 위해 작성한다.
- 동기적으로 처리하려면 객체의 메서드를 불러오는 것처럼 t1.run()으로 작성한다.
- thread.start();
- Runnable 인터페이스를 구현한 클래스의 객체를 생성한다.
- 생성한 객체(t2)를 Thread 객체를 생성하여 넣어준다.
- Thread.sleep(1000);
- 쓰레드를 일시 정지 시키는 방법으로 괄호 안의 숫자는 밀리세컨드 단위이다.
- 해당 코드는 1초간 쓰레드를 정지시킨다.
📖 쓰레드의 우선순위
- 여러 스레드를 가동 시켰을 때 우선적으로 처리될 스레드를 지정할 수 있다.
📖 예제 코드
쓰레드를 상속받는 클래스들
class Thread1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread1");
}
}
}
class Thread2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread2");
}
}
}
class Thread3 extends Thread{
@Override
public void run() {
for(int i = 0 ; i < 100 ; i++) {
System.out.println("Thread3");
}
}
}
Main 클래스
public class MainClass {
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
Thread3 t3 = new Thread3();
// 쓰레드 우선순위 확인
int p1 = t1.getPriority();
int p2 = t2.getPriority();
int p3 = t3.getPriority();
System.out.printf("p1 : %d\n", p1);
System.out.printf("p2 : %d\n", p2);
System.out.printf("p3 : %d\n", p3);
// 우선순위 설정
// 숫자가 높을수록 우선순위가 높음
t1.setPriority(10);
t2.setPriority(1);
t3.setPriority(1);
// 쓰래드 가동
t1.start();
t2.start();
t3.start();
}
}
✔️ 코드 해석
- int p1 = t1.getPriority(); ...
- 쓰레드의 우선순위를 확인하여 int형 정수로 저장한다.
- 지정하지 않은 쓰레드들은 우선순위가 5이다.
- t1.setPriority(10);
- 쓰레드의 우선순위를 지정하는 코드이다.
- 숫자가 높을수록 우선순위가 높다.
- t1은 10으로, t2은 1로 지정하여 t1의 우선순위가 더 높다.
- 실행의 우선순위가 아닌 처리에 대한 우선순위이다.
📖 쓰레드의 동기화(임계 영역)
- 쓰레드는 비동기처리를 수행한다.
- 이에, 다수의 쓰래드가 같은 메서드를 호출했을 경우 메서드의 코드가 비동기적으로 처리된다.
- 만약 쓰레드에서 호출하는 메서드가 동기적으로 처리되기를 원한다면 메서드를 동기화 처리하면 된다.
- 메서드를 동기화 처리하면 메서드를 호출한 쓰레드 순서대로 메서드의 코드가 수행되며 메서드의 코드가 처리되는 동안 다른 쓰레드는 대기하고 있다.
- 동기화는 synchronized를 붙여 표시한다.
📖 예제 코드
Thread 클래스
class Thread1 extends Thread {
@Override
public void run() {
TestClass.testMethod("Thread1");
}
}
class Thread2 extends Thread {
@Override
public void run() {
TestClass.testMethod("Thread2");
}
}
class Thread3 extends Thread {
@Override
public void run() {
TestClass.testMethod("Thread3");
}
}
class TestClass{
public synchronized static void testMethod(String name) {
for(int i = 0 ; i < 100 ; i++) {
System.out.printf("%s : %d\n", name, i);
}
}
}
✔️ 코드 해석
- Thread1, Thread2, Thread3 클래스는 Thread 클래스를 상속받아 구현했다.
- run() 메서드 내부에서 TestClass의 testMethod를 호출한다.
- 해당 메서드는 동기적 처리를 하기 위해 synchronized를 사용했다.
- 때문에 해당 메서드를 호출한 순서대로 수행하게 되며 다른 쓰레드는 대기하게 된다.
Main 클래스
public class MainClass {
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
Thread3 t3 = new Thread3();
t1.start();
t2.start();
t3.start();
}
}
✔️ 코드 해석
- t1.start(); ...
- 쓰레드를 시작한 순서대로 동기적으로 처리된다.
- t1 > t2 > t3 순으로 처리된다.
💡 쓰레드 동기화 console 결과
'Computer > Java' 카테고리의 다른 글
[8일차 Java] Object (0) | 2023.05.06 |
---|---|
[8일차 Java] 예외처리(Exception) (0) | 2023.05.06 |
[7일차 Java] Interface(인터페이스) (0) | 2023.05.06 |
[7일차 Java] Abstract (2) | 2023.05.06 |
[7일차 Java] 중첩 클래스 (0) | 2023.05.06 |