개발자꿈나무

쓰레드 - 멀티쓰레드, 쓰레드 우선순위 본문

자바

쓰레드 - 멀티쓰레드, 쓰레드 우선순위

망재이 2023. 1. 28. 20:47

01. 프로세스와 쓰레드

  • 프로세스 : 간단히 말해서 실행 중인 프로그램, 프로그램을 수행하는 데 필요한 데이터, 메모리 등의 자원과 쓰레드로 구성
  • 쓰레드 : 프로세스의 자원을 이용해서 실제로 작업을 수행하는 역할
  • 모든 쓰레드에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 '멀티쓰레드 프로세스'라고 한다.

 

02. 멀티쓰레딩의 장단점

장점 단점
- CPU의 사용률을 향상시킨다.
- 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
- 같은 프로세스 내에서 자원을 공유하면서 작업하기 때문에, 동기화나 교착상태와 같은 문제들을 고려해줘야한다.

 

03. 쓰레드의 구현과 실행

  • 1. Thread 클래스를 상속받기 
class MyThread extends Thread {
	public void run() { /*작업내용*/ } // Thread클래스의 run()을 오버라이딩
}
  • 2. Runnable 인터페이스를 구현하기
class MyThread implements Runnable {
	public void run() { /*작업내용*/ } // Thread클래스의 run()을 오버라이딩
}
  • 다중상속이 불가하므로 Runnable인터페이스를 구현하는 방법이 일반적이다.
class MyThread extends Thread{
	
	public void run() {
		int sum = 0;
		for(int i=1;i<11;i++) {
			sum += i;
			String name = getName(); //조상인 Thread의 getName()호출 
			System.out.println("스레드 이름 : "+name+"합계 : "+sum);
		}
		
	}
}
	
class MyThread2 implements Runnable {

	@Override
	public void run()
	{
		int sum = 0;
		for(int i=1;i<11;i++) {
			sum += i;
			String name = Thread.currentThread().getName(); //현재 실행중인 Thread의 이름 반환 
			System.out.println("스레드 이름 : "+name+"합계 : "+sum);
		}
	}
	
}


public class Ex_MyThread
{

	public static void main(String[] args)
	{
		MyThread t1 = new MyThread();
		t1.start(); //method호출 방식
		
		
		Runnable r = new MyThread2();
		Thread t2 = new Thread(r); //생성자 Thread(Runnable targer)
		t2.start();
		
	}
	
//	스레드 이름 : Thread-0합계 : 1
//	스레드 이름 : Thread-0합계 : 3
//	스레드 이름 : Thread-0합계 : 6
//	스레드 이름 : Thread-0합계 : 10
//	스레드 이름 : Thread-0합계 : 15
//	스레드 이름 : Thread-1합계 : 1
//	스레드 이름 : Thread-0합계 : 21
//	스레드 이름 : Thread-0합계 : 28
//	스레드 이름 : Thread-0합계 : 36
//	스레드 이름 : Thread-1합계 : 3
//	스레드 이름 : Thread-0합계 : 45
//	스레드 이름 : Thread-0합계 : 55
//	스레드 이름 : Thread-1합계 : 6
//	스레드 이름 : Thread-1합계 : 10
//	스레드 이름 : Thread-1합계 : 15
//	스레드 이름 : Thread-1합계 : 21
//	스레드 이름 : Thread-1합계 : 28
//	스레드 이름 : Thread-1합계 : 36
//	스레드 이름 : Thread-1합계 : 45
//	스레드 이름 : Thread-1합계 : 55
 
//->스레드의 실행순서를 따로 지정해주지 않아서 실행중인 결과가 겹쳐진 상태로 출력됨

}
더보기

★ 참고 ☆

MyThread t1 = new MyThread(); // Thread의 자손 클래스의 인스턴스를 생성

Runnable r = new MyThread2(); // Runnable 인터페이스를 구현한 클래스의 인스턴스를 생성
Thread t2 = new Thread(r); // 생성자 Thread(Runnable targer) 

Thread t2 = new Thread(new MyThread2()); // 두 줄을 한 줄로 표현!

 

static Thread currentThread() // 현재 실행중인 쓰레드의 참조를 반환 

String getName() // 쓰레드의 이름을 반환

 

쓰레드 start()를 한번만 호출할 수 있다. 따라서 작업을 한 번 더 수행해야 한다면 새로운 쓰레드를 생성하고 호출해야한다.

MyThread t1 = new MyThread();

t1.start();

.........

t1.start(); // 에러

MyThread t1 = new MyThread();

t1.start(); // 정상실행

 


public class Multi_SingleThread
{
	public static long startTime = 0;
	
	public static void main(String[] args)
	{

		long startTime = System.currentTimeMillis();
		
		for(int i=0;i<300;i++) {
			System.out.printf("%s",new String("-"));
		}
		System.out.println("소요시간 : "+(System.currentTimeMillis()-startTime));
		
		for(int i=0;i<300;i++) {
			System.out.printf("%s", new String("|"));
		}
		System.out.println("소요시간 : "+(System.currentTimeMillis()-startTime));
		// "-" 소요시간: 88,  "|" 소요시간: 101
		
	}

}
public class Multi_SingleThread
{//멀티쓰레드 실행
	public static long startTime = 0;
	
	public static void main(String[] args)
	{
		
		MyThread3 t1 = new MyThread3();
		t1.start();
		startTime = System.currentTimeMillis();
		
		for(int i=0;i<300;i++) {
			System.out.printf("%s",new String("-"));
		}
		System.out.println("소요시간1 : "+(System.currentTimeMillis()-startTime));
    }
}

class MyThread3 extends Thread {
	public void run() {
		for(int i=0;i<300;i++) {
			System.out.printf("%s", new String("|"));
		}
		System.out.println("소요시간2 : "+(System.currentTimeMillis()-Multi_SingleThread.startTime));
	}
    // 소요시간1 : 72 소요시간2 : 72
}
더보기

☆ 결과 ★

멀티쓰레드를 이용했을 때 둘의 소요시간은 거의 비슷하다!

04. 쓰레드의 우선순위

  • 쓰레드는 우선순위라는 속성(멤버변수)을 가지고 있다.
  • 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
  • 쓰레드의 우선순위 지정하는 방법
  • 쓰레드를 생성한 쓰레드로부터 우선순위를 상속받는다. main메서드를 수행하는 쓰레드는 자동적으로 우선순위가 5를 상속받는다.
void setPriority(int newPriority) //쓰레드의 우선순위를 지정한 값으로 변경한다.
int getPriority() //쓰레드의 우선순위를 반환

public static final int MAX_PRIORITY = 10 //최대 우선순위(1~10)
public static final int MIN_PRIORITY = 1 //최소 우선순위
public static final int NORM_PRIORITY = 5 //보통 우선순위

 

728x90

'자바' 카테고리의 다른 글

람다식 작성하기  (0) 2023.02.13
쓰레드 - 실행제어 (sleep, join, yield)  (0) 2023.01.29
컬렉션 프레임워크 - TreeMap  (0) 2023.01.28
컬렉션 프레임워크 - HashMap  (0) 2023.01.28
컬렉션 프레임워크 - TreeSet  (0) 2023.01.28