Archives
Recent Posts
«   2025/02   »
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
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[8일차 Java] Thread 본문

Computer/Java

[8일차 Java] Thread

Wise-99 2023. 5. 6. 23:36

 

 

출처 : 안드로이드 앱스쿨 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