개발자꿈나무
쓰레드 - 멀티쓰레드, 쓰레드 우선순위 본문
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 |